概述
-
@Transactional 是聲明式事務管理編程中使用的注解
-
添加位置:接口實現類或接口實現方法上,而不是接口類中
-
訪問權限:public 的方法才起作用
-
@Transactional實現原理:
1)事務開始時,通過AOP機制,生成一個代理connection對象,並將其放入DataSource實例的某個與DataSourceTransactionManager相關的某處容器中。在接下來的整個事務中,客戶代碼都應該使用該connection連接數據庫,執行所有數據庫命令[不使用該connection連接數據庫執行的數據庫命令,在本事務回滾的時候得不到回滾](物理連接connection邏輯上新建一個會話session;DataSource與TransactionManager配置相同的數據源)
2)事務結束時,回滾在第1步驟中得到的代理connection對象上執行的數據庫命令,然后關閉該代理connection對象(事務結束后,回滾操作不會對已執行完畢的SQL操作命令起作用)
- spring對於事務異常的處理
unchecked 運行期Exception spring默認會進行事務回滾 比如:RuntimeException
checked 用戶Exception spring默認不會進行事務回滾 比如:Exception
如何改變spring的這種默認事務行為?可以通過在方法上
添加@Transactional(noRollbackFor=RuntimeException.class)讓spring對於RuntimeException不回滾事務
添加@Transactional(RollbackFor=Exception.class)讓spring對於Exception進行事務的回滾
在項目中,@Transactional(rollbackFor=Exception.class),如果類加了這個注解,那么這個類里面的方法拋出異常,就會回滾,數據庫里面的數據也會回滾