為什么要用事務管理
在我們同時操作兩個或更多個數據庫時,可能因為網絡等各方面原因導致中間出現異常。造成像對第一個數據庫的操作成功了,但是對第二個數據庫的操作沒有成功。這樣數據的完整性就被破壞了。
事務:是一組操作的集合,要么同時成功,要么同時失敗
事務控制主要三步操作:開啟事務、提交事務/回滾事務。
-- 開啟事務
start transaction; / begin;-- 1. 保存員工基本信息
insert into emp values (39, 'Tom', '123456', '湯姆', 1, '13300001111', 1, 4000, '1.jpg', '2023-11-01', 1, now(), now());-- 2. 保存員工的工作經歷信息
insert into emp_expr(emp_id, begin, end, company, job) values (39,'2019-01-01', '2020-01-01', '百度', '開發'), (39,'2020-01-10', '2022-02-01', '阿里', '架構');-- 提交事務(全部成功)
commit;-- 回滾事務(有一個失敗)
rollback;
Spring事務管理-(員工管理)
Transactional注解
注解:@Transactional
作用:就是在當前這個方法執行開始之前來開啟事務,方法執行完畢之后提交事務。如果在這個方法執行的過程當中出現了異常,就會進行事務的回滾操作。
位置:業務層的方法上、類上、接口上
方法上:當前方法交給spring進行事務管理(推薦)
類上:當前類中所有的方法都交由spring進行事務管理
接口上:接口下所有的實現類當中所有的方法都交給spring 進行事務管理
可以在application.yml
配置文件中開啟事務管理日志,這樣就可以在控制看到和事務相關的日志信息了
#spring事務管理日志
logging: level: org.springframework.jdbc.support.JdbcTransactionManager: debug
事務進階
?這里主要介紹@Transactional注解當中的兩個常見的屬性:
異常回滾的屬性:
rollbackFor
事務傳播行為:
propagation
我們先來學習下rollbackFor屬性。
:默認情況下,只有出現RuntimeException(運行時異常)才會回滾事務。如果想要所有的異常都回滾,需要配置robackFor屬性
@Transactional(rollbackFor = Exception.class)
2.Propagation注解
就是當一個事務方法被另一個事務方法調用時,這個事務方法應該如何進行事務控制。
屬性值 | 含義 |
REQUIRED | 【默認值】需要事務,有則加入,無則創建新事務 |
REQUIRES_NEW | 需要新事務,無論有無,總是創建新事務 |
SUPPORTS | 支持事務,有則加入,無則在無事務狀態中運行 |
NOT_SUPPORTED | 不支持事務,在無事務狀態下運行,如果當前存在已有事務,則掛起當前事務 |
MANDATORY | 必須有事務,否則拋異常 |
NEVER | 必須沒事務,否則拋異常 |
… |
對于這些事務傳播行為,我們只需要關注以下兩個就可以了:
REQUIRED(默認值)
REQUIRES_NEW