Anda harus menggunakan PESSIMISTIC_WRITE
pada waktu kueri:
Query q = session
.createQuery("from MyObject n where n.state = 'NEW'")
.setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();
Mengunci objek induk sudah cukup. Kebuntuan belum tentu terjadi. Anda mungkin mendapatkan kegagalan akuisisi kunci jika utas yang menahan kunci tidak melepaskannya sebelum utas lain dari waktu tunggu habis.
Karena Anda menggunakan Oracle, beginilah caranya PILIH UNTUK PEMBARUAN bekerja:
Jadi jika T1 memperoleh kunci eksklusif pada beberapa baris, T2 tidak akan dapat membaca catatan tersebut sampai T1 melakukan atau melakukan roll-back. Jika T2 menggunakan READ_UNCOMMITTED tingkat isolasi, maka T2 tidak akan pernah memblokir catatan kunci, karena hanya menggunakan undo log untuk merekonstruksi data seolah-olah ketika kueri dimulai. Berbeda dengan standar SQL, Oracle READ_UNCOMMITTED akan: