tôi có như sau (giản thể) Hibernate thực thể:giao dịch bế tắc với Hibernate trên Oracle
@Entity(name = "Foo")
public class Foo {
@Id
@GeneratedValue
public int id;
@OneToOne
public Bar bar;
}
và
@Entity(name = "Bar")
public class Bar {
@Id
@GeneratedValue
public int id;
@Column
public String field;
@Version
public int version;
}
tôi cập nhật các thực thể trong một giao dịch mà trông gần như thế này:
Bar bar = findBar(em);
Foo foo = findFoo(em);
bar.field = "updated value";
if (<condition>) {
em.remove(foo);
}
em.detach(bar);
em.merge(bar);
Lưu ý rằng em.remove(foo)
chỉ được gọi đôi khi, trong khi thanh luôn là u pdated.
Tôi thường xuyên nhận thấy các lỗi ORA-00060: Deadlock detected
khi chạy ứng dụng. Kết xuất dường như cho thấy rằng hai phiên bế tắc bị khóa trên em.merge(bar)
và em.remove(foo)
, nhưng tôi không hiểu tại sao điều đó lại xảy ra.
Làm thế nào mã bế tắc này có thể? Có cách nào để cơ cấu lại nó tránh bế tắc không?
Dưới đây là một số thông tin thêm từ dấu vết:
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
Có lẽ thật sự không thể tái tạo vấn đề của bạn. Vui lòng xem điều này nếu nó có thể giúp bạn dù sao http://lalitkumarb.wordpress.com/2014/02/25/understanding-oracle-deadlock/ –
Bạn có thể ** TRACE ** các phiên hoàn chỉnh không? –
@LalitKumarB Tôi có dấu vết, và từ đó tôi truy tìm lại các cuộc gọi đó để hợp nhất và xóa. Tôi thấy rằng đó là hai phiên bị khóa. Bạn có muốn thêm bất kỳ thông tin nào từ dấu vết không? – Oleksi