การวิจัยหลักในบทความนี้คือการแนะนำและตัวอย่างของระดับการแยกธุรกรรมฤดูใบไม้ผลิดังนี้
เมื่อธุรกรรมสองรายการดำเนินการกับระเบียนในฐานข้อมูลเดียวกันผลกระทบระหว่างพวกเขาคืออะไร? สิ่งนี้นำเสนอแนวคิดของระดับการแยกธุรกรรม การแยกฐานข้อมูลมีส่วนเกี่ยวข้องกับการควบคุมพร้อมกัน ระดับการแยกของฐานข้อมูลเป็นส่วนหนึ่งของกรดของลักษณะการทำธุรกรรมของฐานข้อมูล กรดนั่นคืออะตอมความสม่ำเสมอการแยกและความทนทาน สปริงมีระดับการแยกธุรกรรมสี่ระดับ: READ_UNCOMMITTED , READ_COMMITTED , REPEATABLE_READ และ SERIALIZABLE อีกอันหนึ่งคือระดับการแยกเริ่มต้นของ DEFAULT ฐานข้อมูลและค่าเริ่มต้น MySQL เป็น REPEATABLE_READ
ลองดูรายละเอียดด้านล่าง
ตามชื่อหมายถึง READ_UNCOMMITTED หมายความว่าหนึ่งธุรกรรมสามารถอ่านบันทึกธุรกรรมที่ไม่ได้ทำธุรกรรมอื่น กล่าวอีกนัยหนึ่งธุรกรรมสามารถอ่านข้อมูลที่ยังคงไม่ได้รับการแก้ไขโดยธุรกรรมอื่น ๆ นี่คือระดับการแยกที่อ่อนแอที่สุดสำหรับการทำธุรกรรมฤดูใบไม้ผลิ ดูรูปด้านล่างธุรกรรม A เปิดอยู่และมีการเขียนบันทึก ในเวลานี้ธุรกรรม B อ่านข้อมูลและอ่านบันทึกนี้ แต่จากนั้นทำธุรกรรมย้อนกลับ ดังนั้นข้อมูลที่อ่านโดยธุรกรรม B ไม่ถูกต้อง (ฐานข้อมูลอยู่ในสถานะไม่ถูกต้อง) สถานการณ์นี้เรียกว่า Dirty Read นอกเหนือจากปัญหาการอ่านที่สกปรกแล้ว READ_UNCOMMITTED อาจมี non-repeatable read (ไม่ใช่การอ่านซ้ำ ๆ ) และ phantom read (phantom reading)
ระดับการแยก READ_COMMITTED บ่งชี้ว่าการทำธุรกรรมสามารถอ่านบันทึกที่มุ่งมั่นเท่านั้นและไม่สามารถอ่านบันทึกที่ไม่มีข้อผูกมัดได้ กล่าวอีกนัยหนึ่งการทำธุรกรรมสามารถอ่านข้อมูลที่มุ่งมั่นเท่านั้นและไม่สามารถอ่านข้อมูลที่ไม่มีข้อผูกมัดได้ ดังนั้นสถานการณ์การอ่านที่สกปรกจะไม่เกิดขึ้นอีกต่อไป แต่ปัญหาอื่น ๆ อาจเกิดขึ้นได้ ดูภาพด้านล่าง
ระหว่างการอ่านสองธุรกรรม A การทำธุรกรรม B ปรับเปลี่ยนบันทึกนั้นและกระทำ ดังนั้นบันทึกที่อ่านก่อนและหลังการทำธุรกรรม A ไม่สอดคล้องกัน ปัญหานี้เรียกว่าการอ่านที่ไม่สามารถทำซ้ำได้ (ไม่สามารถอ่านได้ซ้ำ ๆ ) (บันทึกที่อ่านอย่างไม่สอดคล้องกันระหว่างสองครั้งและการอ่านซ้ำ ๆ จะพบปัญหา)
นอกเหนือจากปัญหาการอ่านที่ไม่สามารถทำซ้ำได้ READ_COMMITTED อาจมีปัญหาการอ่าน Phantom
Repeetable_read หมายความว่าธุรกรรมสามารถอ่านบันทึกจากฐานข้อมูลได้หลายครั้งและบันทึกการอ่านหลายครั้งจะเหมือนกันเหมือนกัน ระดับการแยกนี้สามารถหลีกเลี่ยงปัญหาการอ่านที่สกปรกและอ่านไม่ได้ซ้ำ แต่ปัญหาของการอ่าน Phantom อาจเกิดขึ้น ดังที่แสดงในรูปด้านล่าง
ธุรกรรม A อ่านชุดของบันทึกจากฐานข้อมูลสองครั้งในระหว่างที่ธุรกรรม B แทรกบันทึกและส่ง เมื่อธุรกรรม A อ่านเป็นครั้งที่สองบันทึกที่ธุรกรรม B เพิ่งได้รับการแทรกจะถูกอ่าน ในระหว่างการทำธุรกรรมชุดของบันทึกที่อ่านโดยการทำธุรกรรม A สองครั้งไม่สอดคล้องกันและปัญหานี้เรียกว่า Phantom Read
Serializable เป็นระดับความโดดเดี่ยวที่แข็งแกร่งที่สุดของฤดูใบไม้ผลิ เมื่อมีการดำเนินการธุรกรรมมันจะถูกล็อคในทุกระดับเช่นเมื่ออ่านและเขียนราวกับว่าการทำธุรกรรมนั้นดำเนินไปอย่างต่อเนื่องแทนที่จะเกิดขึ้นด้วยกัน สิ่งนี้จะช่วยป้องกันการอ่านที่สกปรกการอ่านที่ไม่สามารถทำซ้ำได้และการอ่าน phantom แต่มันจะทำให้ประสิทธิภาพลดลง
MySQL เริ่มต้นเป็น REPEATABLE_READ
ลองดูตัวอย่างด้านล่าง เปิดธุรกรรมในฐานข้อมูล MySQL และไม่กระทำ จากนั้นธุรกรรมอื่นจะอ่านบันทึก
ที่จุดเริ่มต้นบันทึกในฐานข้อมูลดังแสดงในรูป
ถัดไปเปิดธุรกรรม A ในฐานข้อมูล MySQL และแทรกบันทึก
แอตทริบิวต์การทำธุรกรรมของคลาสบริการในบริการได้รับการกำหนดค่าเป็น READ_UNCOMMITTED
@Transactional (isolation = isolation.read_uncommitted) บัญชีชั้นเรียนสาธารณะ {private accountdao accountdao; accountdao getaccountdao () {return accountdao;} โมฆะสาธารณะ setaccountdao {accountdao.outmoney (จาก, เงิน); accountdao.inmoney (ถึง, เงิน);} โมฆะสาธารณะ readalluser () {list <countion> accounts = accountDao.getAlluser (); สำหรับ (บัญชี: บัญชี) {system.out.println (บัญชี);}}}}เรียกใช้คลาสทดสอบต่อไปนี้
แพ็คเกจ com.chris.service; นำเข้า org.junit.assert.*; นำเข้า org.junit.test; นำเข้า org.junit.runner.runwith; นำเข้า org.springframework.beans.factory.annotation.autowired; org.springframework.test.context.junit4.springjunit4classrunner; @runwith (springjunit4classrunner.class) @contextconfiguration ("classpath: applicationcontext.xml") {accountService.ReadallUser ();}}ผลลัพธ์มีดังนี้:
จะเห็นได้ว่าธุรกรรมนี้อ่านข้อมูลที่ไม่มีข้อผูกมัด
ในเวลานี้ย้อนกลับการทำธุรกรรมที่เปิดใน MySQL
mysql> ย้อนกลับ;
เรียกใช้โปรแกรมอีกครั้งและผลลัพธ์คือ
บัญชี [ชื่อ = Michael, Money = 1000.0]
บัญชี [name = Jane, money = 1000.0]
บัญชี [name = kate, money = 1000.0]
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการแนะนำระดับการแยกธุรกรรมฤดูใบไม้ผลิและการวิเคราะห์ตัวอย่าง ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!