Don't know if this will fix, but worth a shot, try the SimpleReadWriteEJBLock.
We are running into reentrant issues and are trying to discover the most effective way to handle them.
Also, CMR requires a transaction lock, I believe. I'm guessing its because the CMR collection should not be modified while a read is going over it. Makes sense if that's true, but what a pain because it locks the entity beans over the life of the transaction from that point on.
I also think that with the SimpleReadWriteEJBLock, CMR collection access will still (under the covers) request a write lock, making it no better than the pessimistic case.