The conflict occurs because an INSERT actually locks the "gap" that it's inserting into. In the case of inserting into the end of a table, it actually locks the gap that is after all the existing rows (and theoretically extending out into infinity.
The situation is complicated by the fact that you have a second UNIQUE KEY constraint, so when you run two concurrent sessions, InnoDB needs to create two gap locks, one on the PRIMARY KEY and one on the UNIQUE KEY. Therefore there's a race condition possible, where the two sessions may acquire their locks in such a way that they end up waiting on each other.
I'm wondering why you have an AUTO_INCREMENT primary key, but you're overriding the auto-increment feature. Using the auto-increment may help, in that auto-increment is resolved with a very brief table lock, and therefore you could avoid the deadlock because you'll only have one gap lock. I haven't tested this idea, though.
See also: