一、Spring事務簡介
1. 事務是邏輯處理原子性的保證手段。
2. 事務兩個重要特性:傳播級別和隔離級別。
3.?支持編程式事務管理和聲明式事務管理兩種方式。
4. 事務并發(fā)一般需要相應的隔離措施,否則就會出現(xiàn)各種數(shù)據(jù)問題。
二、傳播級別propagation
1.?REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創(chuàng)建一個新的事務。這是默認值。
2.?REQUIRES_NEW:創(chuàng)建一個新的事務,如果當前存在事務,則把當前事務掛起。
3.?SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續(xù)運行。
4.?NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
5.?NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
6.?MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
7.?NESTED:如果當前存在事務,則在嵌套事務內執(zhí)行。如果當前沒有事務,則執(zhí)行與PROPAGATION_REQUIRED類似的操作。(這個和REQUIRED區(qū)別在于一個是加入到一個事務,一個是在嵌套事務運行)
三、隔離級別isolation
1.READ_UNCOMMITTED(讀未提交)
2.READ_COMMITTED(讀已提交)
3.REPEATABLE_READ(可重復讀,MySQL-InnoDB默認隔離級別)
4.SERIALIZABLE(串行化)
四、@Transactional
1. 開啟事務配置
a.)SpringBoot: @EnableTransactionManagement
b.)SpringMVC基于xml配置

2.?將@Transactional注釋應用于具有公共可見性的方法。如果注釋protected,private方法,則@Transactional不會引發(fā)錯誤,但帶注釋的方法事務配置不會生效。
3.?使用@Transactional注釋具體類(以及具體類的方法),而不是注釋接口;注釋具體類 ,則該類下public方法事務生效。
4.?在代理模式(默認設置)下,只攔截通過代理進入的外部方法調用。目標對象中的方法調用目標對象的另一個方法,事務不會生效,即使調用的方法被標記@Transactional。
5.?proxy-target-class屬性控制為使用@Transactional注釋的類,創(chuàng)建的事務代理類型。如果?proxy-target-class設置為true,則創(chuàng)建基于類的代理。如果?proxy-target-class是false或者省略了屬性,則創(chuàng)建基于標準JDK接口的代理。
6. 一個栗子:


6.1:注釋 @Transactional的componentOperate()方法里,調用另一個service注釋 @Transactional的createLog(),相當于只有@Transactional的componentOperate()方法里事務生效。
6.2:如果想要另一個service注釋 @Transactional的createLog()事務生效,則用子事務@Transactional(propagation = Propagation.REQUIRES_NEW)。
五、常用操作命令
1. 命令行,開啟事務:
set autocommit=off;?
或start transaction;
2. 提交事務:
commit;
3. 設置當前會話隔離級別:
set session transaction isolation level repeatable read;
set session transaction isolation level READ UNCOMMITTED;
set session transaction isolation level READ COMMITTED;
4. 設置系統(tǒng)當前隔離級別:
set global transaction isolation level repeatable read;
5. 查詢當前會話隔離級別:
select @@tx_isolation;
6. 查看系統(tǒng)當前隔離級別:
select @@global.tx_isolation;
7. use xx;