สภาพแวดล้อมการก่อสร้างขั้นพื้นฐานที่นำมาใช้: SpringMVC, MyBatis, MySQL, การจัดการธุรกรรมสปริง Tomcat ทำให้ข้อเสียของการจัดการธุรกรรมทั่วโลกแบบดั้งเดิมและการจัดการธุรกรรมในท้องถิ่นเพื่อให้รูปแบบการจัดการธุรกรรมแบบครบวงจรสามารถใช้ในสภาพแวดล้อมใด ๆ จากนั้นกำหนดค่านโยบายการจัดการธุรกรรมที่แตกต่างกันจากรหัสของคุณในสภาพแวดล้อมที่แตกต่างกัน ใช้ SpringMVC และ MyBatis มีป้ายกำกับอย่างสม่ำเสมอเพื่อประกาศบริการและคอนโทรลเลอร์
เนื่องจากลำดับของการโหลดไฟล์การกำหนดค่าที่เซิร์ฟเวอร์เริ่มต้นคือ web.xml --- root-context.xml (ไฟล์การกำหนดค่าของสปริง) --- servlet-context.xml (ไฟล์การกำหนดค่าของ SpringMvc) การกำหนดค่า. xml ในไฟล์คอนโทรลเลอร์จะถูกสแกนก่อน แต่ในเวลานี้บริการยังไม่ได้รับการปรับปรุงโดยการทำธุรกรรม ความจุ) ดังนั้นเราจะต้องอยู่ในรูท context.xml อย่าสแกนคอนโทรลเลอร์การกำหนดค่ามีดังนี้:
<!-สแกนส่วนประกอบโดยอัตโนมัตินี่คือการลบคอนโทรลเลอร์ด้านล่างตัวควบคุม -> <บริบท: Component-Scan base-package = "com.sence"> <บริบท: ยกเว้นตัวกรองประเภท = "คำอธิบายประกอบ" = "org.springframework.sterotype.contr oller" /> > <!-สแกนส่วนประกอบโดยอัตโนมัตินี่คือการลบคอนโทรลเลอร์ภายใต้การควบคุม -> <บริบท: Component-Scan base-package = "com.sence"> <บริบท: ยกเว้นตัวกรองประเภท = "คำอธิบายประกอบ" = "org.springframework.sterotype.contr oller" /> < /บริบท: Component-Scan "สแกนคอนโทรลเลอร์ใน service-context.xml ในขณะที่ไม่ได้สแกนบริการการกำหนดค่ามีดังนี้:
<!-สแกนคอนโทรลเลอร์ทั้งหมด แต่อย่าสแกนบริการ-> <บริบท: คอมโพเนนต์-สแกนฐานแพคเกจ = "com.sence"> <บริบท: include-filter type = "Annotation" = "หรือ. g.springframework.stereotype .Controller " /> <บริบท: ยกเว้นประเภทฟรี =" Annotion "Expression =" org.springframework.steeotype.service " /> < /บริบท: ส่วนประกอบ ---! คอนโทรลเลอร์ แต่ไม่ได้สแกนบริการ--> <บริบท: Component-Scan base-package = "com.sence"> <บริบท: รวมประเภทตัวกรอง = "คำอธิบายประกอบ" = "org.springframework.stereotype.contro ller" = "org.springframework.sterotype.service" /> < /บริบท: Component-Scan>สามารถกำหนดค่าต่อไปนี้สำหรับการจัดการคำสั่งการกำหนดค่ามีดังนี้:
<!-Transaction Manager ใช้ DataSourceTransactionager-> <bean id = "txManager"> <property name = "DataSource" ref = "DataSource" /> </ebean> <!-Sprin config> <aop: pointcut id = "fooservicemethods" exposition = "การดำเนินการ (*com.sence.*.*. Impl.*.*(.. ))" <aop: ที่ปรึกษาคำแนะนำ-ref = "txadvice" pointcut-ref-ref-ref = "fooservicemethods"/> </aop: config> <tx: คำแนะนำ id = "txAdvice" transaction-manager = "txManager"> <tx: attributes> <เมธอด nam e = "ค้นหา*" อ่านเท่านั้น = "จริง" /> <tx: method name = "love*" read-only = "true"/> <tx: method name = "*" rollback-for = "customexception"/> </tx: attributes> </tx: คำแนะนำ > <!-ตัวจัดการธุรกรรมใช้ DataSourceTransactionager-> <Bean ID = "TXManager"> <ชื่อคุณสมบัติ = "DataSource" ref = "DataSource"/> </> bean> <! config> <aop: pointcut id = "fooservicemethods" expression = "การดำเนินการ (*com.sence.*.*.*.*.*(.. ))" AOP: คำแนะนำที่ปรึกษา-ref = "txadvice" pointcut-ref = "fooservicemethods "/> </aop: config> <tx: คำแนะนำ id =" txAdvice "ธุรกรรม-manager =" txManager "> <tx: attr ibutes> <tx: method name =" find*"read-only =" true "/ > <tx: method name = "load*" read-only = "true"/> <tx: method name = "*" rollback-for = "customexception"/> </tx: attributes> </tx: คำแนะนำ>ณ จุดนี้การกำหนดค่าของฉันเสร็จสมบูรณ์ แต่หลังจากการทดสอบของฉันเมื่อฉันไปที่ตารางฐานข้อมูล MySQL ในแบทช์หนึ่งในวัตถุผิดพลาดและกิจการ Customexception ไม่ได้กลับมา , ขั้นตอนมีดังนี้: 1. ค้นหาว่าการประกาศของการประกาศ -ype การทำธุรกรรมผิดพลาดหรือไม่หากจุดเริ่มต้นผิด