ขอบเขตธุรกรรมที่ประกาศ
ทั้ง@TransactionคำอธิบายประกอบSpring และ JPA ช่วยให้คุณสามารถกำหนดขอบเขตของธุรกรรมแอปพลิเคชันที่กำหนด
ดังนั้นหากวิธีการบริการได้รับการเพิ่มความคิดเห็นด้วยการเพิ่มความคิดเห็น@Transactionalมันจะทำงานในบริบทของการทำธุรกรรม หากวิธีการบริการใช้ DAO หรือที่เก็บหลายรายการการดำเนินการอ่านโฆษณาทั้งหมดจะถูกดำเนินการในธุรกรรมฐานข้อมูลเดียวกัน
ฤดูใบไม้ผลิ @Transactional
org.springframework.transaction.annotation.Transactionalคำอธิบายประกอบได้รับการบริการตั้งแต่รุ่น 1.2 ของกรอบฤดูใบไม้ผลิ (ประมาณ 2005) และมันช่วยให้คุณสามารถตั้งค่าคุณสมบัติการทำธุรกรรมต่อไปนี้:
isolation: ระดับการแยกฐานข้อมูลพื้นฐาน
noRollbackForและnoRollbackForClassName: รายการของExceptionคลาสJava ที่สามารถถูกทริกเกอร์โดยไม่ทริกเกอร์การย้อนกลับทรานแซคชัน
rollbackForและrollbackForClassName: รายการของExceptionคลาสJava ที่ทริกเกอร์การย้อนกลับของธุรกรรมเมื่อถูกส่งออกไป
propagation: ชนิดการเผยแพร่ธุรกรรมที่กำหนดโดยPropagationEnum ตัวอย่างเช่นถ้าบริบทการทำธุรกรรมสามารถสืบทอด (เช่นREQUIRED) หรือบริบทการทำธุรกรรมใหม่ควรจะสร้างขึ้น (เช่นREQUIRES_NEW) หรือถ้ามีข้อยกเว้นควรจะโยนถ้าไม่มีบริบทการทำธุรกรรมที่มีอยู่ (เช่นMANDATORY) หรือถ้าข้อยกเว้นควรจะโยน หากพบบริบทการทำธุรกรรมปัจจุบัน (เช่นNOT_SUPPORTED)
readOnly: ว่าธุรกรรมปัจจุบันควรอ่านข้อมูลโดยไม่ใช้การเปลี่ยนแปลงหรือไม่
timeout: บริบทการทำธุรกรรมควรได้รับอนุญาตให้เรียกใช้กี่วินาทีจนกว่าจะเกิดข้อยกเว้นการหมดเวลา
valueหรือtransactionManager: ชื่อของ Spring TransactionManagerbean ที่จะใช้เมื่อเชื่อมโยงบริบทการทำธุรกรรม
Java EE @Transactional
javax.transaction.Transactionalคำอธิบายประกอบถูกบันทึกโดย Java EE 7 สเปค (ประมาณ 2013) ดังนั้นการเพิ่มความคิดเห็น Java EE จึงเพิ่มขึ้น 8 ปีต่อมาว่า Spring
Java EE @Transactionalกำหนดเพียง 3 คุณลักษณะ:
dontRollbackOn: รายการของExceptionคลาสJava ที่สามารถทริกเกอร์ได้โดยไม่ทริกเกอร์การย้อนกลับทรานแซคชัน
rollbackOn: รายการExceptionคลาสJava ที่ทริกเกอร์การย้อนกลับธุรกรรมเมื่อถูกส่งออกไป
value: กลยุทธ์การขยายพันธุ์ที่กำหนดโดยTxTypeEnum ตัวอย่างเช่นถ้าบริบทการทำธุรกรรมสามารถสืบทอด (เช่นREQUIRED) หรือบริบทการทำธุรกรรมใหม่ควรจะสร้างขึ้น (เช่นREQUIRES_NEW) หรือถ้ามีข้อยกเว้นควรจะโยนถ้าไม่มีบริบทการทำธุรกรรมที่มีอยู่ (เช่นMANDATORY) หรือถ้าข้อยกเว้นควรจะโยน หากพบบริบทการทำธุรกรรมปัจจุบัน (เช่นNOT_SUPPORTED)
เลือกแบบไหน
หากคุณใช้ Spring หรือ Spring Boot ให้ใช้@TransactionalคำอธิบายประกอบของSpring เนื่องจากจะช่วยให้คุณสามารถกำหนดค่าแอตทริบิวต์ได้มากกว่า@TransactionalคำอธิบายประกอบJava EE
หากคุณใช้ Java EE เพียงอย่างเดียวและคุณปรับใช้แอปพลิเคชันของคุณบนเซิร์ฟเวอร์แอปพลิเคชัน Java EE ให้ใช้คำอธิบายประกอบ Java EE `` @ Transactional`
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการแตกต่างกันการกำหนดค่าระดับการแยกเมื่อใช้ฤดูใบไม้ผลิหรือ Java EE @Transactionalคำจำกัดความตรวจสอบบทความนี้
javax.transaction.Transactionalดังนั้นใคร ๆ ก็สามารถใช้มันได้ในแอปพลิเคชันสปริงโดยไม่ต้องดำเนินการใด ๆ เพิ่มเติม IMO นี่เป็นการตัดสินใจที่ไม่ดีนักจากมุมมองการออกแบบเพราะจากประสบการณ์ของฉันผู้พัฒนาจำนวนมากสับสนโดยไม่รู้ตัวทั้งสองในรหัสของพวกเขาซึ่งนำไปสู่ปัญหาในภายหลัง