ใครสามารถช่วยฉันในเรื่องข้อยกเว้นไฮเบอร์เนตที่เป็นไปได้เมื่อสองเธรดอัปเดตวัตถุเดียวกัน
ตัวอย่าง: พนักงานชื่อ "a" อายุ "30" และที่อยู่ "test" thread1 พยายามอัปเดต "a" เป็น "b" และ thread2 พยายามอัปเดต "a" เป็น "c"
ขอบคุณล่วงหน้านะกะธีร์
ใครสามารถช่วยฉันในเรื่องข้อยกเว้นไฮเบอร์เนตที่เป็นไปได้เมื่อสองเธรดอัปเดตวัตถุเดียวกัน
ตัวอย่าง: พนักงานชื่อ "a" อายุ "30" และที่อยู่ "test" thread1 พยายามอัปเดต "a" เป็น "b" และ thread2 พยายามอัปเดต "a" เป็น "c"
ขอบคุณล่วงหน้านะกะธีร์
หากออบเจ็กต์ของคุณเป็นเอนทิตีไฮเบอร์เนต ดังนั้นสองเธรดไม่ควรมีการอ้างอิงถึงออบเจ็กต์เดียวกันตั้งแต่แรก
แต่ละเธรดจะมีเซสชันไฮเบอร์เนตของตัวเอง และแต่ละเซสชันจะมีสำเนาของเอนทิตีของตัวเอง หากคุณมีฟิลด์ที่มีคำอธิบายประกอบด้วย @Version
ในเอนทิตีของคุณ สำหรับการล็อคในแง่ดี หนึ่งในเธรดจะได้รับ OptimisticLockException มิฉะนั้นทุกอย่างจะเป็นไปด้วยดี และเธรดสุดท้ายที่กระทำจะชนะ
ขอบคุณสำหรับคำตอบ และด้านล่างนี้คือความคิดเห็นหลังการสังเกตและการวิเคราะห์
นอกจากนี้เรายังสามารถทำการอัพเดตแบบมีเงื่อนไขด้วย Where clause ในการสืบค้นและใช้วิธีการดำเนินการ Update() ตัวอย่าง: การอัปเดตเมธอด Hibernate - Query -ExecuteUpdate() และส่งคืนจำนวนเอนทิตีที่อัปเดต ดังนั้นหากดำเนินการอัปเดต() ส่งคืน "ศูนย์" แสดงว่าแถวนั้นได้รับการอัปเดตแล้วโดยเธรดอื่น (ไม่มีข้อยกเว้น)
การใช้ @Version (OptimisticLockException)
การใช้การล็อคฐานข้อมูลระดับแถว (ข้อยกเว้นฐานข้อมูล)
การใช้การซิงโครไนซ์ (ข้อยกเว้นการซิงโครไนซ์ Java)