Could you please help me out with a problem that keeps bothering me. I use Hibernate with spring transaction management and Oracle 10g database.
Hibernate is initialized the next way:
Basically I get ObjectNotFoundException each time when 1. one read-only transaction gets an entity, 2. then some another concurrent transaction removes the entity from the database right after, 3. then the first one tries to lazily initialize a set in the entity, and not being capable of finding already removed rows throws the exception.
1 and 3 are executed in the same transaction, it seems like I have Read-Committed strategy. But, Oracle's read-only transactions are always serializable, which means that nothing in the database should change in scope of the transaction.
I wrote a small test to prove that hibernate doesn't behave:
So log shows that transactions that began before database was changed still see the changes.
I spent quite a while trying to figure out the way to force hibernate to use oracle's read-only or serialized transactions but failed.
I even tried to set hibernate.connection.isolation to 8, still didn't help.
I also did a test that proves that Oracle actually does provide serializable access to read-only transactions. Create a table with one column named ID and with three records 1,2,3. In debugger execute next code up to -->.
execute in another window
Then run the code that was frozen in the debugger. c is equal to 3, access was really serializable! [ September 11, 2008: Message edited by: Ivan Koblik ]