Transaction之坑:Spring中配置Transaction與不配置有何區別
阿新 • • 發佈:2019-12-31
首先
Spring中 Transaction管理
配置有兩種方式:
- Annotation式:
@Transactional
- Xml式:
<tx:method />
Note: 以下所有討論,都是用
@Transactional
方式來開啟Transaction支援
。
問題
- 什麼樣的
mehtod
需要配置註解@Transactional
? -
method
沒有配置註解@Transactional
, 難道sql操作
就不會被commit
?
解決
-
配置
@Transactional
的目的就是手動開啟事務,保證method
中一系列sql操作
包含在同一事務中,從保證資料的完整性(回滾或提交)與讀寫安全(隔離級別); -
DataSource
的預設
配置: defaultAutoCommit=true;
即: 如果
method
不配置@Transactional
,則每執行一個 SQL操作,如果成功,預設開啟的事務
就會立即
向資料庫自動commit
,而不能rollback
;
- 為了維護
資料庫的完整性
,保證成批的 SQL 語句要麼全部commit
,要麼全部rollback
。通常包含以下兩種
方式:- 用
BEGIN
,ROLLBACK
,COMMIT
來實現,顯式地開啟並控制一個Transaction
。 - 執行命令
SET AUTOCOMMIT=0
,用來禁止
當前會話自動commit
。
- 用
method
上配置註解@Transactional
,就是使用第一種
方式來實現Transaction管理
(基於SpringAOP
實現方法增強
,這裡表現為TransactionAspectSupport
) 。