@Transactional (การขยายพันธุ์ = การขยายพันธุ์จำเป็น)


108

หากมีใครสามารถอธิบายได้ว่าคำอธิบายประกอบนี้ทำอะไรและเราใช้เมื่อใด:

@Transactional(propagation=Propagation.REQUIRED)

ขอบคุณ


2
คุณอ่านสิ่งนี้แล้วหรือยัง? static.springsource.org/spring/docs/2.5.x/reference/…
Brad

3
Propagation.REQUIRED เป็นโหมดการเผยแพร่เริ่มต้นของธุรกรรมดังนั้นคุณไม่จำเป็นต้องตั้งค่าอย่างชัดเจน
tibtof

คำตอบ:


65

เมื่อการตั้งค่าการแพร่กระจายเป็น PROPAGATION_REQUIRED ขอบเขตของธุรกรรมทางตรรกะจะถูกสร้างขึ้นสำหรับแต่ละวิธีที่ใช้การตั้งค่านี้ แต่ละขอบเขตธุรกรรมเชิงตรรกะดังกล่าวสามารถกำหนดสถานะเฉพาะการย้อนกลับได้ทีละรายการโดยขอบเขตธุรกรรมภายนอกจะเป็นอิสระจากขอบเขตธุรกรรมภายใน แน่นอนในกรณีของพฤติกรรม PROPAGATION_REQUIRED มาตรฐานขอบเขตทั้งหมดเหล่านี้จะถูกจับคู่กับธุรกรรมทางกายภาพเดียวกัน ดังนั้นตัวทำเครื่องหมายแบบย้อนกลับเท่านั้นที่ตั้งค่าในขอบเขตธุรกรรมภายในจึงส่งผลต่อโอกาสของธุรกรรมภายนอกที่จะกระทำจริง (ตามที่คุณคาดหวัง)

ป้อนคำอธิบายภาพที่นี่

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html


168

หากคุณต้องการคำอธิบายเกี่ยวกับการใช้งานนอกเหนือจากที่ระบุไว้ในSpring Docs

พิจารณารหัสนี้ ...

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

เมื่อ doSomething () ถูกเรียกว่ารู้ว่าต้องเริ่ม Transaction บนฐานข้อมูลก่อนที่จะดำเนินการ หากผู้เรียกใช้เมธอดนี้ได้เริ่มทำธุรกรรมแล้ววิธีนี้จะใช้ธุรกรรมทางกายภาพเดียวกันกับการเชื่อมต่อฐานข้อมูลปัจจุบัน

@Transactionalคำอธิบายประกอบนี้ให้วิธีการบอกรหัสของคุณเมื่อดำเนินการว่าต้องมีธุรกรรม มันจะไม่ทำงานโดยไม่มีอย่างใดอย่างหนึ่งดังนั้นคุณสามารถตั้งสมมติฐานนี้ในรหัสของคุณว่าคุณจะไม่เหลือข้อมูลที่ไม่สมบูรณ์ในฐานข้อมูลของคุณหรือต้องล้างข้อมูลบางอย่างหากมีข้อยกเว้นเกิดขึ้น

การจัดการธุรกรรมเป็นเรื่องที่ค่อนข้างซับซ้อนดังนั้นหวังว่าคำตอบที่เข้าใจง่ายนี้จะเป็นประโยชน์



หากใช้การกำหนดค่าตามพร็อกซีเพื่อประกาศและเข้าถึงเลเยอร์ DAO วิธีการในคลาส DAO จะต้องใส่คำอธิบายประกอบด้วย @Transactional ด้วย
Kurapika

หากคุณได้เพิ่มลง@Transactionalในชั้นบริการของคุณแล้วไม่มีข้อกำหนดเพิ่มเติมใด ๆ ที่จะต้องเพิ่ม@Transactionalเมธอด DAO ที่ถูกเรียกภายในธุรกรรมนั้น
Brad

หากdoSomething()เรียกใช้เมธอดอื่นที่ซ้อนกันโดยไม่มี @transactional ธุรกรรมเดียวกันนี้จะใช้กับวิธีการเรียกใช้ด้วยหรือไม่
thisarattr

ใช่ตราบใดที่ยังใช้เธรดเดียวกันในการเรียกใช้เมธอดซ้อนกัน (เช่นคุณไม่ได้สร้างเธรดใหม่อย่างชัดเจน) เนื่องจากธุรกรรม Spring ถูกผูกไว้กับเธรดปัจจุบันโดยใช้ตัวแปร ThreadLocal
แบรด

15

ในแอปพลิเคชัน Spring หากคุณเปิดใช้งานการสนับสนุนธุรกรรมตามคำอธิบายประกอบโดยใช้<tx:annotation-driven/>และใส่คำอธิบายประกอบคลาส / วิธีการใด ๆ ด้วย@Transactional (การแพร่กระจาย = การแพร่กระจาย. REQUIRED)กรอบงาน Spring จะเริ่มต้นธุรกรรมและดำเนินการเมธอดและทำธุรกรรม หาก RuntimeException ใด ๆ เกิดขึ้นธุรกรรมจะถูกย้อนกลับ

การขยายพันธุ์จริง = การขยายพันธุ์ REQUIRED คือระดับการแพร่กระจายเริ่มต้นคุณไม่จำเป็นต้องกล่าวถึงอย่างชัดเจน

สำหรับข้อมูลเพิ่มเติม: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations


5

เพื่อให้เข้าใจถึงการตั้งค่าต่างๆในการทำธุรกรรมและพฤติกรรมที่นำมาใช้สำหรับการจัดการการทำธุรกรรมเช่นREQUIRED, ISOLATIONฯลฯ คุณจะต้องเข้าใจพื้นฐานของการจัดการการทำธุรกรรมเอง

อ่านการจัดการการติดตามสำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำอธิบาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.