首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 事務傳播行為與隔離級別深度實驗:@Transactional 參數全解析

     編輯:Java 相關知識

回滾規則自定義

@Transactional(noRollbackFor = RuntimeException.class) // 遇到運行時異常也不回滾
@Transactional(rollbackFor = Exception.class)           // 遇到任何檢查型異常也回滾

默認:僅回滾 RuntimeException / Error。

七大傳播行為實戰驗證

傳播類型場景外層有事務外層無事務關鍵現象
REQUIRED最常用加入外層事務新建事務內層拋 RuntimeException → 整體回滾
SUPPORTS唯讀輔助加入外層事務無事務運行外層無事務時內層自動提交
MANDATORY強制事務加入外層事務❌ 拋異常禁止無事務調用
REQUIRES_NEW獨立事務掛起外層,新建事務新建事務內層提交/回滾不影響外層
NOT_SUPPORTED非事務操作掛起外層,無事務運行無事務運行適合長耗時查詢、外部調用
NEVER禁用事務❌ 拋異常無事務運行嚴禁事務上下文
NESTED嵌套事務創建 Savepoint同 REQUIRED內層回滾到 Savepoint,外層可繼續

代碼驗證片段

// 外層 REQUIRED
@Transactional(propagation = Propagation.REQUIRED)
public void outer(User u) {
    dao.insert(u);          // 1
    try { inner(null); }    // 2 內層拋 RuntimeException
    catch (RuntimeException e) { dao.insert(new User(500,"fsd")); } // 3 補償
}

// 內層 NESTED
@Transactional(propagation = Propagation.NESTED)
public void inner(User u) {
    dao.insert(u); throw new RuntimeException();
}
// 結果:outer 1 提交,2 回滾到 Savepoint,3 提交 → 庫中有 1 和 3

四大隔離級別實測

級別髒讀不可重複讀幻讀鎖粒度驗證現象
READ_COMMITTED✓✗✗行鎖(讀)外層未提交 INSERT,內層查不到
READ_UNCOMMITTED✗✗✗無讀鎖可讀到未提交數據(髒讀)
REPEATABLE_READ✓✓✗範圍鎖同一事務兩次查詢結果集一致
SERIALIZABLE✓✓✓表鎖完全串行,併發極低

核心區別

  • 不可重複讀:同一行,兩次讀值不同(UPDATE 導致)。
  • 幻讀:同一條件,兩次讀行數不同(INSERT/DELETE 導致)。

Spring @Transactional 隔離屬性

@Transactional(isolation = Isolation.READ_COMMITTED) // 默認 DEFAULT(用數據庫預設)
@Transactional(isolation = Isolation.REPEATABLE_READ)
@Transactional(isolation = Isolation.SERIALIZABLE)

實驗建議:用斷點凍結外層事務,觀察內層可見性,親身體會隔離級別差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved