Transaksi musim semi: memerlukan_perilaku baru

Mungkin saya salah memahami perilaku Spring Requires_new. Ini kode saya:

@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();
}

Ketika innnerMethod2 melontarkan Exception, saya pikir innerMethod1 masih dapat melakukan. Namun semua transaksi luar dan dalam dikembalikan. Apa yang salah saya di sini? Bagaimana yang bisa saya lakukan untuk melakukan innerMethod1 ketika innerMethod2 melakukan rollback?


person Thien Dinh    schedule 08.04.2014    source sumber


Jawaban (1)


Meskipun Anda telah memahami dengan benar perilaku Propagation.REQUIRES_NEW, Anda menemukan kesalahpahaman umum tentang perilaku Transaksional Spring.

Agar semantik transaksional dapat diterapkan (yaitu agar anotasi metode mempunyai efek), metode tersebut perlu dipanggil dari luar kelas. Memanggil metode yang dianotasi dengan transaksional dari dalam kelas sama sekali tidak berpengaruh pada pemrosesan transaksional (karena kelas proxy yang dihasilkan Spring yang berisi kode transaksional tidak ikut berperan).

Dalam contoh Anda innerMethod2 mungkin dianotasi dengan @Transactional tetapi karena dipanggil dari outterMethod, anotasi tersebut tidak diproses.

Lihat ini bagian dari dokumentasi Spring

person geoand    schedule 08.04.2014