I have the following (simplified) Hibernate objects:
@Entity(name = "Foo") public class Foo { @Id @GeneratedValue public int id; @OneToOne public Bar bar; }
and
@Entity(name = "Bar") public class Bar { @Id @GeneratedValue public int id; @Column public String field; @Version public int version; }
I am updating these objects in a transaction that looks something like this:
Bar bar = findBar(em); Foo foo = findFoo(em); bar.field = "updated value"; if (<condition>) { em.remove(foo); } em.detach(bar); em.merge(bar);
Note that em.remove(foo) is called only occasionally, and bar is always updated.
I observe random errors ORA-00060: Deadlock detected when the application starts. The dump seems to suggest that two em.merge(bar) sessions are blocked on em.merge(bar) and em.remove(foo) , but I don't understand why this would be so.
How is this code deadlock? Is there a way to rebuild it to avoid deadlock?
Here is additional information from the track:
Deadlock graph: ---------Blocker(s)-------- ---------Waiter(s)--------- Resource Name process session holds waits process session holds waits TX-00040005-000010dd 73 6557 X 81 6498 X TX-00010018-000010bd 81 6498 X 73 6557 X session 6557: DID 0001-0049-000002F5 session 6498: DID 0001-0051-0000030E session 6498: DID 0001-0051-0000030E session 6557: DID 0001-0049-000002F5 Rows waited on: Session 6557: obj - rowid = 00004797 - AAAEeXAB4AAADH0BBP (dictionary objn - 18331, file - 120, block - 12788, slot - 15) Session 6498: obj - rowid = 00007191 - AAAHGRAB4AAAACBBBo (dictionary objn - 29041, file - 120, block - 129, slot - 40) ----- Information for the OTHER waiting sessions ----- Session 6498: program: JDBC Thin Client application name: JDBC Thin Client, hash value=2546894660 current SQL: delete from Foo where id=:1 ----- Current SQL Statement for this session (sql_id=sfasdgasdgaf) ----- update Bar set field=:1, version=:2 where id=:3 and version=:4
source share