การทำธุรกรรมเจได
เมื่อเราใช้ JDBC เพื่อเชื่อมต่อกับ MySQL เราต้องเริ่มการทำธุรกรรมก่อนที่จะดำเนินการคำสั่ง SQL ใน MyBatis เราต้องใช้ OpenSession () เพื่อรับวัตถุธุรกรรมเซสชันเพื่อดำเนินการ SQL การดำเนินการค้นหาและการดำเนินการอื่น ๆ เมื่อการดำเนินการของเราในฐานข้อมูลสิ้นสุดลงวัตถุธุรกรรมจะรับผิดชอบในการปิดการเชื่อมต่อฐานข้อมูล
วัตถุธุรกรรมใช้ในการจัดการและดำเนินการฐานข้อมูลต่างๆ มันสามารถเปิดและปิดการเชื่อมต่อฐานข้อมูลดำเนินการคำสั่ง SQL และย้อนกลับการดำเนินการข้อผิดพลาดกลับ
Redis ของเรายังมีวัตถุการจัดการธุรกรรมซึ่งอยู่ภายใต้ redis.clients.jedis.transaction
รหัสที่เกี่ยวข้องสำหรับการทำธุรกรรมเจได:
แพ็คเกจ cn.com.redis; นำเข้า redis.clients.jedis.jedis; นำเข้า redis.clients.jedis.transaction; การทดสอบระดับสาธารณะ 7 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {Jedis Jedis = New Jedis ("192.168.248.129", 6379); ธุรกรรมธุรกรรม = jedis.multi (); // ส่งคืนวัตถุควบคุมธุรกรรม // การโหลดล่วงหน้าการดำเนินการที่จะดำเนินการในวัตถุธุรกรรมในธุรกรรมล่วงหน้า set ("k4", "v4"); Transaction.set ("K5", "V5"); transaction.exec (); // execute}}ลองดู Redis:
พบว่ามีการเพิ่มข้อมูลแล้ว
เราเปลี่ยนค่าของ K4 และค่า K5 เป็น "V44" และ "V55" จากนั้นเพิ่มคำสั่ง transaction.discard () หลังจากคำสั่ง transaction.exec ():
แพ็คเกจ cn.com.redis; นำเข้า redis.clients.jedis.jedis; นำเข้า redis.clients.jedis.transaction; การทดสอบระดับสาธารณะ 7 {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {Jedis Jedis = New Jedis ("192.168.248.129", 6379); ธุรกรรมการทำธุรกรรม = jedis.multi (); // ส่งคืนวัตถุควบคุมธุรกรรม // การโหลดล่วงหน้าการดำเนินการที่จะดำเนินการในวัตถุธุรกรรมในธุรกรรมล่วงหน้า set ("k4", "v44"); Transaction.set ("K5", "V55"); transaction.discard (); // ย้อนกลับ}}คุณจะพบว่าการดำเนินการแทรกข้อมูลถูกย้อนกลับและค่าทั้งสองใน Redis ไม่ได้เปลี่ยนแปลง:
เราจำลองธุรกรรมที่กวาดบัตรเครดิตหนึ่งครั้งโดยใช้ธุรกรรม Redis เพื่อจัดการตรรกะบางอย่าง:
แพ็คเกจ cn.com.redis; นำเข้า redis.clients.jedis.jedis; นำเข้า redis.clients.jedis.transaction; Public Class TestTransaction {// จำลองการใช้บัตรเครดิตและการชำระคืนโมฆะคงที่สาธารณะหลัก (String [] args) {testTransaction t = testTransaction ใหม่ (); บูลีน retvalue = t.transmethod (100); if (retvalue) {system.out.println ("ประสบความสำเร็จในการใช้การบริโภคบัตรเครดิต!"); } else {system.out.println ("ไม่สามารถใช้การใช้บัตรเครดิต!"); }} /*** ในเงื่อนไขของคนธรรมดาคำสั่ง Watch คือการทำเครื่องหมายคีย์ หากมีการทำเครื่องหมายคีย์ * หากมีการแก้ไขคีย์โดยคนอื่นก่อนที่จะส่งธุรกรรมการทำธุรกรรมจะล้มเหลว สถานการณ์นี้สามารถลองอีกครั้งในโปรแกรม* * * ก่อนอื่นทำเครื่องหมายสมดุลจากนั้นตรวจสอบว่ายอดคงเหลือเพียงพอหรือไม่ หากไม่เพียงพอให้ยกเลิกเครื่องหมายโดยไม่หัก * หากเพียงพอให้เริ่มการทำธุรกรรมสำหรับการดำเนินการอัปเดต * หากผู้อื่นได้รับการแก้ไขยอดคงเหลือคีย์ในช่วงเวลานี้ข้อผิดพลาดจะถูกรายงานเมื่อส่งธุรกรรม (EXEC) * ข้อผิดพลาดประเภทนี้สามารถติดอยู่ในโปรแกรมแล้วดำเนินการอีกครั้งจนกว่าจะประสบความสำเร็จ * */ บูลีนส่วนตัว TransThod (จำนวน int) {system.out.println ("คุณใช้บัตรเครดิตเพื่อชำระเงินล่วงหน้า"+จำนวน+"หยวน"); Jedis Jedis = New Jedis ("192.168.248.129", 6379); Int Balance = 1000; // ยอดคงเหลือที่มีอยู่ในตราสารหนี้; // จาก int amttoSubtract = จำนวน; // จำนวนเงินแปรงจริง jedis.set ("ยอดคงเหลือ", string.valueof (ยอดคงเหลือ)); jedis.watch ("สมดุล"); //JEDIS.SET("Balance "," 1100 "); // ประโยคนี้ไม่ควรปรากฏขึ้น เพื่อจำลองโปรแกรมอื่น ๆ รายการได้รับการแก้ไข Balance = Integer.ParseInt (jedis.get ("สมดุล")); ถ้า (ยอดคงเหลือ <amttosubtract) {// ยอดคงเหลือที่มีอยู่น้อยกว่าจำนวนเงินที่แปรงจริงการทำธุรกรรมจะถูกปฏิเสธ jedis.unwatch (); System.out.println ("ยอดคงเหลือที่มีอยู่ไม่เพียงพอ!"); กลับเท็จ; } else {// เมื่อยอดคงเหลือที่มีอยู่เพียงพอจากนั้นเรียกใช้งานระบบปฏิบัติการหักเงิน. ธุรกรรมธุรกรรม = jedis.multi (); ธุรกรรม. decrby ("ยอดคงเหลือ", amttosubtract); // ยอดคงเหลือลบจำนวนเงินในการทำธุรกรรม amttosubtract.incrby ("หนี้", amttosubtract); // หนี้บัตรเครดิตเพิ่มจำนวนเงินใน amttosubtract transaction.exec (); // หนี้ = Integer.parseint (jedis.get ("หนี้")); System.out.println ("การดำเนินการธุรกรรมการทำธุรกรรมหนี้สิ้นสุดลง ... "); System.out.println ("ยอดคงเหลือที่มีอยู่ของคุณ:"+ยอดคงเหลือ); System.out.println ("คุณเป็นหนี้เงิน:"+หนี้); กลับมาจริง; -รหัสนี้จำลองผู้ใช้ที่ใช้บัตรเครดิตเพื่อปัด 100 หยวน ในเวลานี้ยอดคงเหลือที่มีอยู่ของบัตรเครดิตควรลดลง 100 หยวนและควรเพิ่มหนี้ 100 หยวน
ผลการทำงาน:
ผลลัพธ์ของ Redis:
พิสูจน์ว่าการดำเนินการของเราประสบความสำเร็จ
คำสั่งนาฬิกาถูกเพิ่มเพื่อป้องกันการดำเนินการอื่น ๆ จากการขัดจังหวะการทำธุรกรรมหรือส่งผลกระทบต่อผลการคำนวณของธุรกรรมในระหว่างการดำเนินการทำธุรกรรมส่งผลให้สถานการณ์ผิดปกติเช่น "การอ่านภาพลวงตา" และ "ข้อมูลสกปรก" คำสั่ง Watch สร้างคีย์ เมื่อพบว่าคีย์ได้รับการแก้ไขโดยคนอื่นในระหว่างการดำเนินการธุรกรรมจะล้มเหลว ข้อผิดพลาดประเภทนี้สามารถติดอยู่ในโปรแกรมแล้วดำเนินการอีกครั้งจนกว่าจะประสบความสำเร็จ ดังนั้นคำสั่ง Watch สามารถรับรองการซิงโครไนซ์ของข้อมูล
เพื่อพิสูจน์จุดประสงค์ของคำสั่งนาฬิกาเราปล่อย Jedis.set ("สมดุล", "1100"); ความคิดเห็นในรหัสข้างต้นจากนั้นวิธีการส่งผ่านจะทำให้เกิดข้อยกเว้นที่ถูกขัดจังหวะ: โยน InterruptedException วิธีการหลักจะจับข้อยกเว้นที่ถูกขัดจังหวะจากนั้นกล่องเตือนที่สอดคล้องกันจะปรากฏขึ้น
แพ็คเกจ cn.com.redis; นำเข้า java.util.list; นำเข้า redis.clients.jedis.jedis; นำเข้า redis.clients.jedis.transaction; Public Class TestTransaction {// จำลองการใช้บัตรเครดิตและการชำระคืนโมฆะคงที่สาธารณะหลัก (String [] args) {testTransaction t = testTransaction ใหม่ (); บูลีน retvalue = false; บูลีนขัดจังหวะ = false; ลอง {retvalue = t.transmethod (100); } catch (interruptedException e) {interrupted = true; System.out.println ("การทำธุรกรรมถูกขัดจังหวะโปรดดำเนินการอีกครั้ง!"); } ในที่สุด {if (retvalue) {system.out.println ("ประสบความสำเร็จในการใช้บัตรเครดิต!"); } else {ถ้า (! ถูกขัดจังหวะ) {system.out.println ("ไม่สามารถใช้บัตรเครดิตไม่ได้! }}}}} /*** ในแง่ง่ายคำสั่ง Watch คือการทำเครื่องหมายคีย์ หากมีการทำเครื่องหมายคีย์ * หากมีการแก้ไขคีย์โดยคนอื่นก่อนที่จะส่งธุรกรรมการทำธุรกรรมจะล้มเหลว สถานการณ์นี้สามารถลองอีกครั้งในโปรแกรม* * * ก่อนอื่นทำเครื่องหมายสมดุลจากนั้นตรวจสอบว่ายอดคงเหลือเพียงพอหรือไม่ หากไม่เพียงพอให้ยกเลิกเครื่องหมายโดยไม่หัก * หากเพียงพอให้เริ่มการทำธุรกรรมสำหรับการดำเนินการอัปเดต * หากผู้อื่นได้รับการแก้ไขยอดคงเหลือคีย์ในช่วงเวลานี้ข้อผิดพลาดจะถูกรายงานเมื่อส่งธุรกรรม (EXEC) * ข้อผิดพลาดประเภทนี้สามารถติดอยู่ในโปรแกรมแล้วดำเนินการอีกครั้งจนกว่าจะประสบความสำเร็จ * */ บูลีนส่วนตัว TransThod (จำนวน int) พ่น InterruptedException {system.out.println ("คุณใช้บัตรเครดิตของคุณเพื่อชำระเงินล่วงหน้า"+จำนวน+"หยวน"); Jedis Jedis = New Jedis ("192.168.248.129", 6379); Int Balance = 1000; // ยอดคงเหลือที่มีอยู่ในตราสารหนี้; // จำนวนเงินสัมบูรณ์จำนวน int amttoSubtract = จำนวน; // ขีด จำกัด แปรงจริง jedis.set ("ยอดคงเหลือ", string.valueof (ยอดคงเหลือ)); jedis.watch ("สมดุล"); jedis.set ("สมดุล", "1100"); // ประโยคนี้ไม่ควรปรากฏ เพื่อจำลองโปรแกรมอื่น ๆ รายการได้รับการแก้ไข Balance = Integer.ParseInt (jedis.get ("สมดุล")); ถ้า (ยอดคงเหลือ <amttosubtract) {// ยอดคงเหลือที่มีอยู่น้อยกว่าจำนวนเงินที่แปรงจริงการทำธุรกรรมจะถูกปฏิเสธ jedis.unwatch (); System.out.println ("ยอดคงเหลือที่มีอยู่ไม่เพียงพอ!"); กลับเท็จ; } else {// เมื่อยอดคงเหลือที่มีอยู่เพียงพอจากนั้นเรียกใช้งานระบบปฏิบัติการหักเงิน. ธุรกรรมธุรกรรม = jedis.multi (); Transaction.decrby ("ยอดคงเหลือ", amttosubtract); // ยอดคงเหลือลบด้วยเงินของการทำธุรกรรม Amttosubtract.incrby ("หนี้", amttosubtract); // หนี้บัตรเครดิตเพิ่มเงินของ amttosubtract รายการ แก้ไขในระหว่างการดำเนินการ System.out.println ("หักธุรกรรมการดำเนินการขัดจังหวะ ... "); โยน InterruptedException ใหม่ (); } else {// การส่งธุรกรรมที่ประสบความสำเร็จยอดคงเหลือ = integer.parseint (jedis.get ("ยอดคงเหลือ")); หนี้ = Integer.parseint (jedis.get ("หนี้")); System.out.println ("หักการดำเนินการธุรกรรมสิ้นสุด ... "); System.out.println ("ยอดคงเหลือที่มีอยู่ของคุณ:"+ยอดคงเหลือ); System.out.println ("คุณเป็นหนี้เงิน:"+หนี้); กลับมาจริง; -เรียกใช้อีกครั้งและดูเอฟเฟกต์:
สิ่งนี้แสดงให้เห็นว่าหากข้อมูลได้รับการแก้ไขหลังจากดำเนินการคำสั่ง Watch และก่อนที่จะส่งธุรกรรมการดำเนินการธุรกรรมจะไม่สำเร็จซึ่งทำให้มั่นใจได้ถึงความปลอดภัยของข้อมูล
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น