ก่อนที่จะพูดคุยเกี่ยวกับการจัดการธุรกรรมฤดูใบไม้ผลิลองคิดดูว่าเราดำเนินการข้อมูลในไฮเบอร์เนตอย่างไรเมื่อเราไม่ใช้ฤดูใบไม้ผลิ ในไฮเบอร์เนตเราต้องเริ่มการทำธุรกรรมก่อนจากนั้นดำเนินการข้อมูลจากนั้นส่งธุรกรรมและปิดธุรกรรม เหตุผลที่เราทำเช่นนี้เป็นเพราะการทำธุรกรรมการทำธุรกรรมอัตโนมัติเริ่มต้นของไฮเบอร์เนตเป็นเท็จซึ่งต้องการให้เราส่งธุรกรรมด้วยตนเอง หากคุณไม่ต้องการส่งธุรกรรมด้วยตนเองทุกครั้งคุณสามารถตั้งค่าให้ทำธุรกรรมในไฟล์ของฉันโดยอัตโนมัติ hibernate.cfg.xml:
รหัส XML
<property name = "defaultautocommit"> <value> false </value> </property>
แม้ว่าเราจะตั้งค่าวิธีการทำธุรกรรมให้เป็นอัตโนมัติ แต่ก็สามารถดำเนินการข้อมูลได้ แต่สิ่งนี้ไม่ตรงกับความต้องการทางธุรกิจที่แท้จริงของเราเพราะบางครั้งหลังจากที่ฉันบันทึกข้อมูลหนึ่งข้อมูลฉันหวังว่ามันจะสามารถบันทึกข้อมูลอื่นต่อไปได้ ฉันหวังว่าจะทำธุรกรรมร่วมกันหลังจากบันทึกข้อมูลสองรายการขึ้นไป ด้วยวิธีนี้แม้ว่าจะมีข้อผิดพลาดเราสามารถย้อนกลับและรักษาความสอดคล้องของข้อมูลได้ ความสำเร็จหรือความล้มเหลว ในเวลานี้เราไม่สามารถทำธุรกรรมโดยอัตโนมัติหลังจากบันทึกข้อมูลหนึ่งข้อมูลเนื่องจากพวกเขาไม่ได้อยู่ในการทำธุรกรรมเดียวกันและเราไม่สามารถรับประกันความสอดคล้องของข้อมูลได้ ดังนั้นในเวลานี้เราจำเป็นต้องกำหนดค่าการทำธุรกรรมของเราด้วยตนเองซึ่งต้องใช้กลไกการจัดการธุรกรรมที่จัดทำโดยฤดูใบไม้ผลิสำหรับไฮเบอร์เนต การจัดการธุรกรรมที่จัดทำโดยฤดูใบไม้ผลิสามารถแบ่งออกเป็นสองประเภท: โปรแกรมและการประกาศ การเขียนโปรแกรมถูกควบคุมจริงในรหัส เช่นเดียวกับ Hibernate ดำเนินการข้อมูลมันเริ่มการทำธุรกรรมและส่งธุรกรรม วิธีนี้มีข้อ จำกัด บางประการดังนั้นโดยทั่วไปเราใช้การประกาศเพื่อกำหนดค่าการทำธุรกรรมของเรา
การกำหนดค่าการทำธุรกรรมที่ประกาศส่วนใหญ่แบ่งออกเป็นขั้นตอนต่อไปนี้:
1. การกำหนดค่าการทำธุรกรรมที่ประกาศ
(1) กำหนดค่าตัวจัดการธุรกรรม
(2) ลักษณะการแพร่กระจายของธุรกรรม
(3) คลาสและวิธีการเหล่านั้นใช้ธุรกรรม
<!-กำหนดค่า SessionFactory ที่ตัวจัดการธุรกรรมระบุฟังก์ชั่นและส่งมอบการทำธุรกรรมให้กับสปริงสำหรับการประมวลผล-> <bean id = "TransactionManager"> <property name = "SessionFactory"> <ref Bean = "SessionFactory" <tx: แอตทริบิวต์> <tx: method name = "บันทึก*" การแพร่กระจาย = "ต้องการ"/> <tx: method name = "ลบ*" การแพร่กระจาย = "ต้องการ"/> <tx: method name = "update*" การแพร่กระจาย = "จำเป็น"/> <tx: method name = "get*" red-only = "true"/> </tx: แอตทริบิวต์> </tx: คำแนะนำ> <!-วิธีใดของคลาสเหล่านั้นมีส่วนร่วมในการทำธุรกรรม-> <aop: config> <aop: pointcut id = "allservicemethod" การดำเนินการ (*com.coe.service.*(.. ) คำแนะนำ-ref = "txadvice"/> </aop: config>
เมื่อกำหนดค่าการทำธุรกรรมเรามักจะตั้งขอบเขตการทำธุรกรรมเป็นเลเยอร์บริการนั่นคือเลเยอร์ตรรกะทางธุรกิจของคุณเพราะเรามักจะทำคอลัมน์การดำเนินงานข้อมูลบางส่วนของเราในเลเยอร์ตรรกะทางธุรกิจของเรา หากวางไว้ในชั้นข้อมูล DAO ความละเอียดจะเล็กเกินไป นอกจากนี้หากเรากำหนดค่าการทำธุรกรรมในเลเยอร์ตรรกะทางธุรกิจมันจะเป็นประโยชน์ต่อแคชรองของเราซึ่งคุณจะพบในอนาคตเมื่อคุณใช้งานจริง
2. วิธีการเขียนวิธีการทางธุรกิจ
ในเวลานี้เราสามารถใช้วิธีการใช้งานข้อมูลที่มีให้ใน hibernatetemplate เพื่อเขียนวิธีตรรกะทางธุรกิจของเราในเลเยอร์ตรรกะทางธุรกิจของเรา แน่นอนว่าวิธีการของเราจะต้องเหมือนกับที่กำหนดค่าไว้ในการกำหนดค่าธุรกรรมของเราโดยใช้บันทึกลบอัปเดตและรับเป็นจุดเริ่มต้นของวิธีการของเรา ควรสังเกตว่าโดยค่าเริ่มต้นข้อยกเว้นรันไทม์จะย้อนกลับ (รวมถึงการสืบทอด subclass runtimeException) และข้อยกเว้นทั่วไปจะไม่ม้วน
สุดท้ายมาสรุปลักษณะการแพร่กระจายหลายประการของการทำธุรกรรม:
1. Propagation_Required: หากมีการทำธุรกรรมมีการสนับสนุนธุรกรรมปัจจุบัน หากไม่มีธุรกรรมจะเปิดใช้งาน
2. Propagation_supports: หากมีการทำธุรกรรมมีการสนับสนุนธุรกรรมปัจจุบัน หากไม่มีธุรกรรมการดำเนินการของการไม่ทำธุรกรรม
3. Propagation_mandatory: หากมีการทำธุรกรรมอยู่แล้วการทำธุรกรรมปัจจุบันจะได้รับการสนับสนุน หากไม่มีธุรกรรมที่ใช้งานอยู่
4. Propagation_requires_New: เปิดธุรกรรมใหม่เสมอ หากมีการทำธุรกรรมอยู่แล้วการทำธุรกรรมที่มีอยู่จะถูกระงับ
5. Propagation_not_supported: ดำเนินการที่ไม่ได้ทำธุรกรรมและระงับธุรกรรมที่มีอยู่เสมอ
6. Propagation_Never: ดำเนินการที่ไม่ได้ทำธุรกรรมเสมอหากมีการทำธุรกรรมที่ใช้งานอยู่จะมีการโยนข้อยกเว้น
7. Propagation_nested: หากมีการทำธุรกรรมที่ใช้งานอยู่มันจะทำงานในการทำธุรกรรมที่ซ้อนกัน หากไม่มีธุรกรรมที่ใช้งานอยู่ให้ดำเนินการตาม TransactionDefinition.propagation_Required
ผ่านบทความนี้ฉันหวังว่ามันจะช่วยให้คุณเข้าใจการจัดการธุรกรรมแบบบูรณาการของฤดูใบไม้ผลิและไฮเบอร์เนต ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!