Understanding & Resolving Deadlock in SQL Server 2008 R2
Looks like multiple statements in a transaction.  One row is the target of the first statement of the first transaction and the second statement of the second transaction.  And vice-versa: the same row is targeted by the second statement of the first transaction and the first statement of the second transaction.

Is there any reason why you are using multi-statement transactions?

If so, can you "order" the statements within the transaction so that they always affect rows in a predefined order?  In a row with an id identity key, if consecutive statements affect higher id transactions, the chance for conflict is greatly reduced.