ธุรกรรมในฤดูใบไม้ผลิ: ต้องใช้ _ พฤติกรรมใหม่

ฉันอาจเข้าใจผิดพฤติกรรมของ Spring Requires_new นี่คือรหัสของฉัน:

@Transactional(rollbackFor=Exception.class,propagation=Propagation.REQUIRED)
public void outterMethod() throws Exception{
    innerMethod1();
    innerMethod2();         
}
@Transactional(rollbackFor=Exception.class,propagation=Propagation.REQUIRES_NEW)
public void innerMethod1() throws Exception{
    testService.insert(new Testbo("test-2", new Date()));
}

@Transactional(rollbackFor=Exception.class,propagation=Propagation.REQUIRES_NEW)
public void innerMethod2() throws Exception{
    testService.insert(new Testbo("test-2", new Date()));
    throw new Exception();
}

เมื่อ innnerMethod2 ส่ง Exception ฉันคิดว่า InnerMethod1 ยังคงสามารถคอมมิตได้ แต่การย้อนกลับของธุรกรรมภายนอกและภายในทั้งหมด ฉันผิดอะไรที่นี่? ฉันจะทำอย่างไรเพื่อคอมมิต InnerMethod1 เมื่อย้อนกลับ InnerMethod2


person Thien Dinh    schedule 08.04.2014    source แหล่งที่มา


คำตอบ (1)


แม้ว่าคุณจะเข้าใจพฤติกรรมของ Propagation อย่างถูกต้องแล้ว REQUIRES_NEW แต่คุณก็ยังสะดุดกับความเข้าใจผิดทั่วไปเกี่ยวกับพฤติกรรมการทำธุรกรรมของ Spring

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

ในตัวอย่างของคุณ innerMethod2 อาจมีคำอธิบายประกอบด้วย @Transactional แต่เนื่องจากมันถูกเรียกจาก outterMethod คำอธิบายประกอบจึงไม่ได้รับการประมวลผล

ลองดูสิ่งนี้ เป็นส่วนหนึ่งของเอกสาร Spring

person geoand    schedule 08.04.2014