ขอบเขตธุรกรรมที่ประกาศ
ทั้ง@Transaction
คำอธิบายประกอบSpring และ JPA ช่วยให้คุณสามารถกำหนดขอบเขตของธุรกรรมแอปพลิเคชันที่กำหนด
ดังนั้นหากวิธีการบริการได้รับการเพิ่มความคิดเห็นด้วยการเพิ่มความคิดเห็น@Transactional
มันจะทำงานในบริบทของการทำธุรกรรม หากวิธีการบริการใช้ DAO หรือที่เก็บหลายรายการการดำเนินการอ่านโฆษณาทั้งหมดจะถูกดำเนินการในธุรกรรมฐานข้อมูลเดียวกัน
ฤดูใบไม้ผลิ @Transactional
org.springframework.transaction.annotation.Transactional
คำอธิบายประกอบได้รับการบริการตั้งแต่รุ่น 1.2 ของกรอบฤดูใบไม้ผลิ (ประมาณ 2005) และมันช่วยให้คุณสามารถตั้งค่าคุณสมบัติการทำธุรกรรมต่อไปนี้:
isolation
: ระดับการแยกฐานข้อมูลพื้นฐาน
noRollbackFor
และnoRollbackForClassName
: รายการของException
คลาสJava ที่สามารถถูกทริกเกอร์โดยไม่ทริกเกอร์การย้อนกลับทรานแซคชัน
rollbackFor
และrollbackForClassName
: รายการของException
คลาสJava ที่ทริกเกอร์การย้อนกลับของธุรกรรมเมื่อถูกส่งออกไป
propagation
: ชนิดการเผยแพร่ธุรกรรมที่กำหนดโดยPropagation
Enum ตัวอย่างเช่นถ้าบริบทการทำธุรกรรมสามารถสืบทอด (เช่นREQUIRED
) หรือบริบทการทำธุรกรรมใหม่ควรจะสร้างขึ้น (เช่นREQUIRES_NEW
) หรือถ้ามีข้อยกเว้นควรจะโยนถ้าไม่มีบริบทการทำธุรกรรมที่มีอยู่ (เช่นMANDATORY
) หรือถ้าข้อยกเว้นควรจะโยน หากพบบริบทการทำธุรกรรมปัจจุบัน (เช่นNOT_SUPPORTED
)
readOnly
: ว่าธุรกรรมปัจจุบันควรอ่านข้อมูลโดยไม่ใช้การเปลี่ยนแปลงหรือไม่
timeout
: บริบทการทำธุรกรรมควรได้รับอนุญาตให้เรียกใช้กี่วินาทีจนกว่าจะเกิดข้อยกเว้นการหมดเวลา
value
หรือtransactionManager
: ชื่อของ Spring TransactionManager
bean ที่จะใช้เมื่อเชื่อมโยงบริบทการทำธุรกรรม
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
: กลยุทธ์การขยายพันธุ์ที่กำหนดโดยTxType
Enum ตัวอย่างเช่นถ้าบริบทการทำธุรกรรมสามารถสืบทอด (เช่น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 นี่เป็นการตัดสินใจที่ไม่ดีนักจากมุมมองการออกแบบเพราะจากประสบการณ์ของฉันผู้พัฒนาจำนวนมากสับสนโดยไม่รู้ตัวทั้งสองในรหัสของพวกเขาซึ่งนำไปสู่ปัญหาในภายหลัง