Kemungkinan pengecualian hibernasi ketika dua utas memperbarui Objek yang sama?

Bisakah seseorang membantu saya dengan kemungkinan pengecualian hibernasi ketika dua utas memperbarui Objek yang sama?

misal: karyawan dengan nama "a", usia "30" dan alamat "test" thread1 mencoba memperbarui "a" menjadi "b" dan thread2 mencoba memperbarui "a" menjadi "c"

Terima kasih sebelumnya, Kathir


person Kathir    schedule 14.11.2012    source sumber
comment
Dalam kasus saya, thread1 memperbarui a ke b dan thread2 memperbarui 30 menjadi 35, tetapi keduanya menulis ke baris yang sama dan saya menemui jalan buntu. Adakah bantuan dalam hal ini?   -  person Jerry    schedule 12.01.2018


Jawaban (2)


Jika objek Anda adalah entitas Hibernasi, maka dua thread tidak boleh memiliki referensi ke objek yang sama.

Setiap thread akan memiliki sesi Hibernasi sendiri, dan setiap sesi akan memiliki salinan entitasnya sendiri. Jika Anda memiliki bidang yang dianotasi dengan @Version di entitas Anda, untuk penguncian optimis, salah satu thread akan mendapatkan OptimisticLockException. Jika tidak, semuanya akan berjalan baik-baik saja, dan thread terakhir yang dikomit akan menang.

person JB Nizet    schedule 14.11.2012

Terima kasih atas jawabannya dan di bawah ini adalah komentar setelah observasi dan analisis

  1. Kita juga dapat melakukan pembaruan bersyarat dengan klausa Where dalam kueri dan menggunakan metode mengeksekusiUpdate(). Contoh: Metode Hibernate - Query -executeUpdate() memperbarui dan mengembalikan jumlah entitas yang diperbarui. Jadi jika mengeksekusiUpdate() mengembalikan "nol" itu berarti baris tersebut telah diperbarui oleh thread lain. (Tanpa pengecualian)

  2. Menggunakan @Versi. (OptimisticLockException)

  3. Menggunakan kunci DB Tingkat Baris. (Pengecualian DB)

  4. Menggunakan Sinkronisasi. (Pengecualian Sinkronisasi Java)

person Kathir    schedule 15.11.2012
comment
dapatkah Anda membantu memahami poin#4, apa itu pengecualian Sinkronisasi? - person Gaurava Agarwal; 11.07.2016