1. 程式人生 > 其它 >0700-二叉搜尋樹中的搜尋

0700-二叉搜尋樹中的搜尋

required: 如果當前有事務就使用當前事務, 如果沒有就新建一個事務(default)

requires_new: 無論有沒有事務,總是新建一個事務

nested: 和required類似, 不同點在於會設定一個還原點, 如果出問題只會還原本方法, 並不會還原外部方法。

supports: 支援當前事務, 如果當前沒有事務, 就以非事務的方式執行

not_supported: 以非事務的方式執行, 如果當前存在事務就掛起

never: 總是在非事務下執行, 如果有事務就報錯

mandatory: 總是在事務下執行,如果沒有事務就報錯

------------------------------------------------------------------------------具體例項---------------------------------------------------------------------------------------------

REQUIRED

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
    before();
    b();
    after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void b(){
    //crud...
}

a()呼叫b()的情況下:a()會開啟一個事務, 然後b()會繼續使用a()的事務。

單獨呼叫b():b()就會新開啟一個事務。無論是哪個一個報錯(拋異常), before() b() after()這三個都會回滾。

如果巢狀執行的方法要求一起執行成功或者一起回滾,則選擇該事物傳播級別。

REQUIRES_NEW

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
    before();
    b();
    after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
void b(){
    //crud...
}

a()呼叫b()的情況下:a()會開啟一個事務, 然後b()不會繼續使用a()的事務,會單獨開啟一個事務。如果b()報錯了,只會回滾b(),不會影響before()。after()報錯了也不會影響b()。

如果巢狀執行的方法要求各自事務獨立,不能進行相互影響,則選擇本事務傳播級別。

NESTED

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
    before();
    b();
    after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.NESTED)
void b(){
    //crud...
}

a()呼叫b()的情況下:a()會開啟一個事務, 然後b()會繼續使用a()的事務。但是b()會設定一個還原點, 當b()報錯了,只會回滾b()自已,不會回滾before()。如果after()報錯了這三個都會回滾。

如果巢狀執行的方法要求內部方法出錯只回滾自己,外部方法執行失敗回滾所有,單獨執行時候自動開啟一個執行,則選擇該事物傳播級別。

MANDATORY

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
    before();
    b();
    after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.MANDATORY)
void b(){
    //crud...
}

a()呼叫b()的情況下:和REQUIRED一樣。

單獨呼叫b():報錯。

如果巢狀執行的方法要求一起執行成功或者一起回滾,單獨執行時候不允許以非事務方式執行,則選擇該事物傳播級別。

NEVER

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
    before();
    b();
    after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.NEVER)
void b(){
    //crud...
}

a()呼叫b()的情況下:報錯。

單獨呼叫b():不開啟事務。

如果巢狀執行的方法要求內部方法不允許在事務中執行,單獨執行時候必須以非事務方式執行,則選擇該事物傳播級別。

SUPPORTS

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
    before();
    b();
    after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.SUPPORTS)
void b(){
    //crud...
}

a()呼叫b()的情況下:和REQUIRED一樣。

單獨呼叫b():不開啟事務。

如果巢狀執行的方法要求一起執行成功或者一起回滾,單獨執行時候以非事務方式執行,則選擇該事物傳播級別。

NOT_SUPPORTED

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
void a(){
    before();
    b();
    after();
}
@Transactional(rollbackFor = Exception.class, propagation = Propagation.NOT_SUPPORTED)
void b(){
    //crud...
}

a()呼叫b()的情況下:掛起a()的事務,不在事務的情況下b(),after()也無法影響b()。

單獨呼叫b():不開啟事務。

如果巢狀執行的方法要求內部巢狀方法不會對外部方法事務造成影響並且內部方法不需要事務,單獨執行時候以非事務方式執行,則選擇該事物傳播級別。