ความเป็นมา: สำหรับระเบียนเดียวกันในฐานข้อมูลหากคนสองคนแก้ไขข้อมูลในเวลาเดียวกันและในที่สุดก็ซิงโครไนซ์กับฐานข้อมูลผลลัพธ์จะคาดเดาไม่ได้เนื่องจากการเกิดขึ้นพร้อมกัน ทางออกที่ง่ายที่สุดคือการเพิ่มฟิลด์เวอร์ชันลงในบันทึกในตาราง เมื่อแก้ไขบันทึกคุณต้องเปรียบเทียบว่าเวอร์ชันตรงกับหรือไม่ หากตรงกับมันจะได้รับการอัปเดตและหากไม่ตรงกันก็จะล้มเหลวโดยตรง หากการอัปเดตสำเร็จจะมีการตั้งค่าเวอร์ชัน+1 ซึ่งเป็นล็อคในแง่ดีที่เรียกว่า แน่นอนตรรกะดังกล่าวดีที่สุดที่จะโปร่งใสให้กับนักพัฒนาและปลั๊กอินนี้อยู่ที่นี่เพื่อทำสิ่งนี้
1. วิธีการใช้งาน: เพิ่มการกำหนดค่าต่อไปนี้ในไฟล์กำหนดค่า MyBatis และเสร็จสมบูรณ์
<plugins> <plugin interceptor = "com.chrhc.mybatis.locker.interceptor.optimisticLocker"/> </plugins>
2. คำอธิบายของการกำหนดค่าปลั๊กอิน:
แอตทริบิวต์ Java ที่สอดคล้องกับคอลัมน์ล็อคในแง่ดีของการกำหนดค่าฐานข้อมูลเริ่มต้นสำหรับปลั๊กอินเป็นเวอร์ชัน ที่นี่คุณสามารถปรับแต่งชีวิตแอตทริบิวต์ตัวอย่างเช่น:
<ปลั๊กอิน> <plugin interceptor = "com.chrhc.mybatis.locker.interceptor.optimisticLocker"> <property name = "versionColumn" value = "xxx"/> <!-ชื่อคอลัมน์ของฐานข้อมูล->
3. ผล:
ก่อนหน้านี้: อัปเดตชื่อผู้ใช้ชื่อ =?, รหัสผ่าน =? id =?
หลังจาก: อัปเดตชื่อผู้ใช้ชื่อ =?, รหัสผ่าน =?, เวอร์ชัน = เวอร์ชัน+1 ที่ไหน id =? และเวอร์ชัน =?
4. คำอธิบายของค่าเวอร์ชัน:
1. เมื่อ PreparedStatement ได้รับค่าเวอร์ชันปลั๊กอินจะเพิ่มขึ้นโดยอัตโนมัติ 1
2. กระบวนการควบคุมทั้งหมดของการล็อคในแง่ดีนั้นโปร่งใสสำหรับผู้ใช้ซึ่งคล้ายกับการล็อคในแง่ดีของไฮเบอร์เนตและผู้ใช้ไม่จำเป็นต้องใส่ใจเกี่ยวกับค่าของการล็อคในแง่ดี
5. คำอธิบายหลักการปลั๊กอิน:
ปลั๊กอินสกัดกั้นคำสั่ง UPDATE ที่ดำเนินการโดย MyBatis และเพิ่มเครื่องหมายล็อคในแง่ดีในคำสั่ง SQL ดั้งเดิม ตัวอย่างเช่น SQL ดั้งเดิมคือ:
อัปเดตชื่อผู้ใช้ชื่อ =?, รหัสผ่าน =? id =?,
จากนั้นผู้ใช้ไม่จำเป็นต้องแก้ไขคำสั่ง SQL ด้วยความช่วยเหลือของปลั๊กอินคำสั่ง SQL ด้านบนจะถูกเขียนใหม่โดยอัตโนมัติเป็น:
อัปเดตชื่อผู้ใช้ชื่อ =?, รหัสผ่าน =?, เวอร์ชัน = เวอร์ชัน + 1 ที่ไหน id =? และเวอร์ชัน =?,
แบบฟอร์มผู้ใช้ไม่จำเป็นต้องใส่ใจเกี่ยวกับคุณค่าก่อนและหลังเวอร์ชัน การกระทำทั้งหมดมีความโปร่งใสสำหรับผู้ใช้และปลั๊กอินทำฟังก์ชั่นเหล่านี้ให้เสร็จสมบูรณ์
6. การประชุมเริ่มต้น:
1. คำสั่งของคำสั่ง UPDATE ที่สกัดกั้นโดยปลั๊กอินนี้ล้วนเป็น PreparedStatement ซึ่งใช้ได้สำหรับ SQL ด้วยวิธีนี้เท่านั้น
2. แท็ก <update> ของ mapper.xml ต้องสอดคล้องกับวิธีการแม็กอินเตอร์เฟสนั่นคือการใช้วิธีการที่ MyBatis แนะนำ แต่หลายอินเทอร์เฟซสามารถสอดคล้องกับแท็ก mapper.xml <update>;
3. ปลั๊กอินนี้จะไม่ทำอะไรกับผลลัพธ์ของ SQL และสิ่งที่ SQL ควรกลับมาคือสิ่งที่;
4. ปลั๊กอินสกัดกั้นคำสั่งอัปเดตทั้งหมดโดยค่าเริ่มต้น หากผู้ใช้ไม่ต้องการการควบคุมการล็อคในแง่ดีสำหรับการอัปเดตบางอย่างให้เพิ่ม @VersionLocker (เท็จ) หรือ @VersionLocker (value = false) ลงในวิธีการแม็ปเปอร์อินเตอร์เฟสที่สอดคล้องกันเพื่อให้ปลั๊กอินจะไม่ทำอะไรกับการอัปเดตนี้ซึ่งเทียบเท่ากับการไม่มีปลั๊กอินนี้
5. ปลั๊กอินนี้ในปัจจุบันไม่รองรับการล็อคในแง่ดีสำหรับการอัปเดตแบตช์ในขณะนี้ เหตุผลก็คือการอัปเดตแบทช์ไม่มีสถานการณ์แอปพลิเคชันมากมายในการพัฒนาจริงและเป็นการยากที่จะพัฒนาล็อคในแง่ดีสำหรับการอัปเดตแบทช์
6. ประเภทพารามิเตอร์ของอินเทอร์เฟซ Mapper จะต้องสอดคล้องกับประเภทจริงที่ผ่านเข้ามานี่เป็นเพราะในเวอร์ชัน JDK ไม่มีวิธีใดที่อยู่ด้านล่าง JDK8 เพื่อรับชื่อพารามิเตอร์รายการของอินเทอร์เฟซ ดังนั้นปลั๊กอินจึงใช้ประเภทพารามิเตอร์และพารามิเตอร์เป็นการแมปเพื่อให้ตรงกับลายเซ็นวิธีการ
ที่อยู่ GitHub: https://github.com/xjs1919/locker
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น