ข้อยกเว้นการไฮเบอร์เนตที่เป็นไปได้เมื่อสองเธรดอัพเดตออบเจ็กต์เดียวกันหรือไม่

ใครสามารถช่วยฉันในเรื่องข้อยกเว้นไฮเบอร์เนตที่เป็นไปได้เมื่อสองเธรดอัปเดตวัตถุเดียวกัน

ตัวอย่าง: พนักงานชื่อ "a" อายุ "30" และที่อยู่ "test" thread1 พยายามอัปเดต "a" เป็น "b" และ thread2 พยายามอัปเดต "a" เป็น "c"

ขอบคุณล่วงหน้านะกะธีร์


person Kathir    schedule 14.11.2012    source แหล่งที่มา
comment
ในกรณีของฉัน thread1 กำลังอัปเดต a เป็น b และ thread2 กำลังอัปเดต 30 ถึง 35 แต่ทั้งคู่กำลังเขียนลงในแถวเดียวกัน และฉันกำลังประสบปัญหาการหยุดชะงัก ความช่วยเหลือเกี่ยวกับเรื่องนี้?   -  person Jerry    schedule 12.01.2018


คำตอบ (2)


หากออบเจ็กต์ของคุณเป็นเอนทิตีไฮเบอร์เนต ดังนั้นสองเธรดไม่ควรมีการอ้างอิงถึงออบเจ็กต์เดียวกันตั้งแต่แรก

แต่ละเธรดจะมีเซสชันไฮเบอร์เนตของตัวเอง และแต่ละเซสชันจะมีสำเนาของเอนทิตีของตัวเอง หากคุณมีฟิลด์ที่มีคำอธิบายประกอบด้วย @Version ในเอนทิตีของคุณ สำหรับการล็อคในแง่ดี หนึ่งในเธรดจะได้รับ OptimisticLockException มิฉะนั้นทุกอย่างจะเป็นไปด้วยดี และเธรดสุดท้ายที่กระทำจะชนะ

person JB Nizet    schedule 14.11.2012

ขอบคุณสำหรับคำตอบ และด้านล่างนี้คือความคิดเห็นหลังการสังเกตและการวิเคราะห์

  1. นอกจากนี้เรายังสามารถทำการอัพเดตแบบมีเงื่อนไขด้วย Where clause ในการสืบค้นและใช้วิธีการดำเนินการ Update() ตัวอย่าง: การอัปเดตเมธอด Hibernate - Query -ExecuteUpdate() และส่งคืนจำนวนเอนทิตีที่อัปเดต ดังนั้นหากดำเนินการอัปเดต() ส่งคืน "ศูนย์" แสดงว่าแถวนั้นได้รับการอัปเดตแล้วโดยเธรดอื่น (ไม่มีข้อยกเว้น)

  2. การใช้ @Version (OptimisticLockException)

  3. การใช้การล็อคฐานข้อมูลระดับแถว (ข้อยกเว้นฐานข้อมูล)

  4. การใช้การซิงโครไนซ์ (ข้อยกเว้นการซิงโครไนซ์ Java)

person Kathir    schedule 15.11.2012
comment
คุณช่วยทำความเข้าใจจุดที่ 4 ข้อยกเว้นการซิงโครไนซ์ได้ไหม - person Gaurava Agarwal; 11.07.2016