目錄
Spring 對事務的支持
事務 @Transactional
Spring 對事務的支持
提醒一次:你的程序是否支持事務首先取決于數據庫 ,比如使用 MySQL 的話,如果你選擇的是 innodb 引擎,那么恭喜你,是可以支持事務的。但是,如果你的 MySQL 數據庫使用的是 myisam 引擎的話,那不好意思,從根上就是不支持事務的。
這里再多提一下一個非常重要的知識點: MySQL 怎么保證原子性的?
我們知道如果想要保證事務的原子性,就需要在異常發生時,對已經執行的操作進行回滾,在 MySQL 中,恢復機制是通過 回滾日志(undo log) 實現的,所有事務進行的修改都會先先記錄到這個回滾日志中,然后再執行相關的操作。如果執行過程中遇到異常的話,我們直接利用 回滾日志 中的信息將數據回滾到修改之前的樣子即可!并且,回滾日志會先于數據持久化到磁盤上。這樣就保證了即使遇到數據庫突然宕機等情況,當用戶再次啟動數據庫的時候,數據庫還能夠通過查詢回滾日志來回滾將之前未完成的事務。
事務 @Transactional
在要開啟事務的方法上使用@Transactional
注解即可!
@Transactional(rollbackFor = Exception.class)
public void save() {......
}
我們知道 Exception 分為運行時異常 RuntimeException 和非運行時異常。在@Transactional
注解中如果不配置rollbackFor
屬性,那么事物只會在遇到RuntimeException
的時候才會回滾,加上rollbackFor=Exception.class
,可以讓事物在遇到非運行時異常時也回滾。
@Transactional
注解一般用在可以作用在類
或者方法
上。
-
作用于類:當把
@Transactional 注解放在類上時,表示所有該類的
public 方法都配置相同的事務屬性信息。 -
作用于方法:當類配置了
@Transactional
,方法也配置了@Transactional
,方法的事務會覆蓋類的事務配置信息。