天天看點

事物的傳播

public class Spread {

@Transactional(rollbackFor=Exception.class)
public void entry(){
    doSomething();
}


@Transactional(rollbackFor=Exception.class)
public void doSomething(){

}
}
           

1 方法doSomething本身帶事物,調用該doSomething的方法entry也是帶着事物

這時候2個事物碰到一起了該怎麼工作

2 這裡所說的事物的傳播都是指目前線程内,不跨線程,不涉及子線程的

事物傳播的方式

發現事物的依據是目前線程内沒有第二個事物

第一種:REQUIRED

如果目前存在事物,則加入該事物;如果目前沒有事物,則建立一個新事物。這是預設值 就是說entry方法是先執行的,當entry方法已經開啟了一個事物,調用doSomething方法時,doSomething方法的事物判斷目前線程是否開啟事物,如果開啟了,就不再建立新事物直接加入到entry事物中,若doSomething的方法事物發現目前線程内沒有事物,那麼它自己就開啟一個事物

第二種:REQUIRED_NEW

建立一個新事物,如果目前存在事物,則把目前的挂起entry開啟自己的事物,調用到doSomething時挂起entry的事物,開啟doSomething的事物

第三種:SUPPORTS

如果目前存在事物,則加入該事物,如果目前沒有事物,則以非事物的方式運作

第四種:NOT_SUPPORTS

以非事物的方式運作,如果目前存在事物,則把目前事物挂起;其實就是不讓按照事物方式運作,使用場景:完全不以事物方式運作的程式,暴力,慎用

第五種:NEVER

以非事物方式運作,如果目前存在事物抛出異常 也是不以事物方式運作

第六種:MANDATORY

如果目前存在事物則加入該事物,如果不存在則抛出異常,意思就是程式都要按照事物運作,安全級别比較高

第七種:NESTED

目前存在事物,則建立一個事物作為目前事物的嵌套事物運作,如果目前不存在事物則取值等價于第一個