1. 程式人生 > >Spring的七種事務傳播機制

Spring的七種事務傳播機制

詳細 class support 繼續 tar 傳播行為 類型 情況 隔離

概述

當我們調用一個基於Spring的Service接口方法(如UserService#addUser())時,它將運行於Spring管理的事務環境中,Service接口方法可能會在內部調用其它的Service接口方法以共同完成一個完整的業務操作,因此就會產生服務接口方法嵌套調用的情況, Spring通過事務傳播行為控制當前的事務如何傳播到被嵌套調用的目標服務接口方法中。

事務傳播是Spring進行事務管理的重要概念,其重要性怎麽強調都不為過。但是事務傳播行為也是被誤解最多的地方,在本文裏,我們將詳細分析不同事務傳播行為的表現形式,掌握它們之間的區別。

事務傳播行為種類

Spring在TransactionDefinition接口中規定了7種類型的事務傳播行為,它們規定了事務方法

事務方法發生嵌套調用時事務如何進行傳播:

表1事務傳播行為類型

事務傳播行為類型

說明

PROPAGATION_REQUIRED

如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。

PROPAGATION_SUPPORTS

支持當前事務,如果當前沒有事務,就以非事務方式執行。

PROPAGATION_MANDATORY

使用當前的事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW

新建事務,如果當前存在事務,把當前事務掛起。

PROPAGATION_NOT_SUPPORTED

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER

以非事務方式執行,如果當前存在事務,則拋出異常。

PROPAGATION_NESTED

如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

PROPAGATION_REQUIRES_NEW 啟動一個新的, 不依賴於環境的 "內部" 事務. 這個事務將被完全 commited 或 rolled back 而不依賴於外部事務, 它擁有自己的隔離範圍, 自己的鎖, 等等. 當內部事務開始執行時, 外部事務將被掛起, 內務事務結束時, 外部事務將繼續執行.

PROPAGATION_NOT_SUPPORTED 外部方法的Transaction暫停直至innerMethod執行完畢

Spring的七種事務傳播機制