Transaction之坑:Spring中配置Transaction與不配置有何區別
阿新 • • 發佈:2019-02-19
首先
Spring中 Transaction管理
配置有兩種方式:
- Annotation式:
@Transactional
- Xml式:
<tx:method />
Note:以下所有討論,都是用
@Transactional
方式來開啟Transaction支援
。
問題
- 什麼樣的
mehtod
需要配置註解@Transactional
? method
沒有配置註解@Transactional
, 難道write操作
就不會被commit
?
解決
事務是用來管理
insert
,update
,delete
, 這些write操作
。如果method
read操作
,不用配置@Transactional
;DataSource
的預設
配置:即:如果
method
不配置@Transactional
,則每執行一個 SQL操作,如果成功,預設開啟的事務
就會立即
向資料庫自動commit
,而不能rollback
;如果
method
中包含一系列write操作
,為了維護資料庫的完整性
,保證成批的 SQL 語句要麼全部commit
,要麼全部rollback
。通常包含以下兩種
方式:
- 用
BEGIN
,ROLLBACK
,COMMIT
Transaction
。 - 執行命令
SET AUTOCOMMIT=0
,用來禁止
當前會話自動commit
。
method
上配置註解@Transactional
,就是使用第一種
方式來實現Transaction管理
(基於SpringAOP
實現方法增強
,這裡表現為TransactionAspectSupport
)。- 用
注意
大多數時候,我們都可以不使用
Transaction管理
,僅僅是對系列 write 操作
,增加邏輯判斷
,這也是解決Redis事務
的常用方式,但是無奈會增加程式邏輯的複雜性。