It looks like the root of the problem is that the code in ObjectStore is not detecting failed transactions, and hence is not rolling them back.
Using JDO with locally managed transactions, you're expected to do something like this: Transaction tx = pm.currentTransaction(); try { tx.begin(); { do some stuff } tx.commit(); } finally { if (tx.isActive()) { tx.rollback(); } } But the code in ObjectStore instead wraps these methods in openTransaction() and commitTransaction(). After calling tx.commit() the method commitTransaction() should then call tx.isActive() to check if the transaction failed and call rollback if appropriate. Currently it doesn't do this and instead always returns false. I'm filing a ticket against this now. Thanks. Carl