精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

@Transactional注解使用以及事務失效的場景

開發 前端
本文通過對 @Transactional 注解相關介紹,列舉出可能會出現事務失效的場景。發生最多就是自身調用、異常被吃、異常拋出類型不匹配這三個。

一、事務的本質

1、何為事務管理

數據庫事務,是指作為單個邏輯工作單元執行的一系列操作,要么完全地執行,要么完全地不執行。

事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合為一個要么全部成功要么全部失敗的單元,可以簡化錯誤恢復并使應用程序更加可靠。

一個邏輯工作單元要成為事務,必須滿足所謂的 ACID (原子性、一致性、隔離性和持久性)屬性。事務是數據庫運行中的邏輯工作單位。

2、 Spring 中的事務管理

實際工作中我們更多的是結合 Spring 來做項目的這時我們要滿足的情況是這種。

Controller層:
  UserService:addUser();
  Service層(UserService):
   addUser(): insertUser()+ insertLog()
  Dao層:
   UserDao:insertUser();
   LogDao: insertDao();

可以看出我們在 Service 中是可能調用多個 Dao 的方法來操作數據庫中的數據的,我們要做的就是要保證 UserService 中的 addUser() 方法中的相關操作滿足事務的要求

常見的開啟 Spring 事務方式:@Transactional

二、 @Transactional 注解

1、原理:

事務開啟后,通過 AOP 機制生成一個代理數據庫連接對象并將其放入 DataSource 實例的某個 DataSourceTransactionManager 相關對象容器中。在整個事務中,業務代碼中所有的數據庫連接都應該是同一個連接,不使用該連接的 Sql 是不會被回滾的。業務代碼出現異常時會執行回滾操作

底層實現:

圖片圖片

2、屬性介紹:

隔離級別( @Transactional ( isolation = Isolation.DEFAULT ) ): 為了解決數據庫容易出現的問題,分級加鎖處理策略

隔離級別

描述

ISOLATION_DEFAULT

Spring 默認隔離級別,以連接的數據庫的事務隔離級別為準;Mysql (可重復讀)

ISOLATION_READ_UNCOMMITTED

讀未提交:最低的隔離級別,其含義是允許一個事務讀取另外一個事務沒有提交的數據。未提交讀是一種危險的隔離級別,所以一般在我們實際的開發中應用不廣,但是它的優點在于并發能力高,適合那些對數據一致性沒有要求而追求高并發的場景,它的最大壞處是出現臟讀

ISOLATION_READ_COMMITTED

讀已提交:是指一個事務只能讀取另外一個事務已經提交的數據,不能讀取未提交的數據

ISOLATION_REPEATABLE_READ

可重復讀:目標是克服讀寫提交中出現的不可重復讀的現象,因為在讀寫提交的時候,可能出現一些值的變化,影響當前事務的執行

ISOLATION_SERIALIZABLE

串行化,數據庫最高的隔離級別,它會要求所有的 SQL 都會按照順序執行,這樣就可以克服上述隔離級別出現的各種問題,所以它能夠完全保證數據的一致性

超時時間 ( @Transactional ( timeout = 30 ) ): 定義一個事務執行過程多久算超時,以便超時后回滾。可以防止長期運行的事務占用資源.對應注解中的屬性 timeout (注意點:這個超時時間在數據庫事務超時的范疇內的)

是否只讀 ( @Transactional ( readOnly = true ) ):表示這個事務只讀取數據但不更新數據

回滾機制( @Transactional ( rollbackFor = Exception.class ):定義遇到異常時回滾策略

傳播機制( @Transactional ( propagation = Propagation.REQUIRED ): 對事務的傳播特性進行定義,共有 7 種類型 (一個事務內調用另外一個事務)

事務行為

說明

PROPAGATION_REQUIRED

如果當前上下文中存在事務,那么加入該事務,如果不存在事務,創建一個事務,這是默認的傳播屬性值

PROPAGATION_SUPPORTS

如果當前上下文存在事務,則支持事務加入事務,如果不存在事務,則使用非事務的方式執行

PROPAGATION_MANDATORY

支持當前事務,假設當前沒有事務,就拋出異常

PROPAGATION_REQUIRES_NEW

每次都會新建一個事務,并且同時將上下文中的事務掛起,執行當前新建事務完成以后,上下文事務恢復再執行

PROPAGATION_NOT_SUPPORTED

如果當前上下文中存在事務,則掛起當前事務,然后新的方法在沒有事務的環境中執行

PROPAGATION_NEVER

如果當前上下文中存在事務,則拋出異常,否則在無事務環境上執行代碼

PROPAGATION_NESTED

如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與 PROPAGATION_REQUIRED 類似的操作。

三、常見的 @Transactional 注解 事務沒生效的場景

1、訪問權限問題 (只有 public 方法會生效)

示例代碼:

@Service
public class UserService {
  @Transactional
  private void add(UserModel userModel) {
    saveData(userModel);
    updateData(userModel);
  }
}

原因:Spring 要求被代理方法必須得是 public 的

圖片

也就是說,如果我們自定義的事務方法(即目標方法),它的訪問權限不是 public,而是 private、 default 或 protected 的話, Spring 則不會提供事務功能

2、方法用 final 修飾,不會生效

示例代碼:

@Service
public class UserService {
  @Transactional
  public final void add(UserModel userModel){
    saveData(userModel);
    updateData(userModel);
  }
}

原因:

Spring 事務底層使用了 AOP,也就是通過 JDK 動態代理或者 CGLIB,幫我們生成了代理類,在代理類中實現的事務功能。但如果某個方法用 final 修飾了,那么在它的代理類中,就無法重寫該方法,而添加事務功能。

注意:如果某個方法是 static 修飾的,同樣無法通過動態代理,變成事務方法。

3、同一個方法內直接調用,會造成事務失效

示例代碼:

@Service
public class UserService {
  @Autowired
  private UserMapper userMapper;
  
  public void add(UserModel userModel) {
    userMapper.insertUser(userModel);
    updateStatus(userModel);
  }

  @Transactional
  public void updateStatus(UserModel userModel) {
    doSameThing();
  }
}

原因:

我們看到在事務方法 add 中,直接調用事務方法 updateStatus。從前面介紹的內容可以知道, updateStatus 方法擁有事務的能力是因為 Spring AOP 生成代理了對象,但是這種方法直接調用了 this 對象的方法,并不會從 IOC 拿到加上 AOP 事務相關方法的動態代理對象 所以 updateStatus 方法不會生成事務

4、(類本身) 未被 Spring 管理

示例代碼:

//@Service
public class UserService {

  @Transactional
  public void add(UserModel userModel) {
    saveData(userModel);
    updateData(userModel);
  }    
}

原因:

使用 Spring 事務的前提是:對象要被 Spring IOC 管理,需要創建 bean 實例

5、多線程調用

示例代碼:

@Service
public class UserService {

  @Autowired
  private UserMapper userMapper;
  @Autowired
  private RoleService roleService;

  @Transactional
  public void add(UserModel userModel) throws Exception {
    userMapper.insertUser(userModel);
      new Thread(() -> {
        roleService.doOtherThing();
      }).start();
  }
}

@Service
public class RoleService {
  @Transactional
  public void doOtherThing() {
  }
}

原因:同一個事務,其實是指同一個數據庫連接,只有擁有同一個數據庫連接才能同時提交和回滾。如果在不同的線程,拿到的數據庫連接肯定是不一樣的,所以是不同的事務。

6、錯誤的傳播特性

示例代碼:

@Service
public class UserService {
  @Autowired
  private UserMapper userMapper;
  @Autowired
  private RoleService roleService;
  
  @Transactional(propagation = Propagation.REQUIRED)
  public void add(UserModel userModel) throws Exception {
    userMapper.insertUser(userModel);
      new Thread(() -> {
        roleService.doOtherThing();
      }).start();
  }
}

@Service
public class RoleService {
  @Transactional(propagation = Propagation.NEVER)
  public void doOtherThing() {
  }
}

原因:RoleService 中 doOtherThing() 方法上設置的事物傳播類型為 Propagation.NEVER,即存在事務就拋出異常

7、自己吞了異常

示例代碼:

@Slf4j
@Service
public class UserService {
  @Transactional
  public void add(UserModel userModel) {
    try {
      saveData(userModel);
      updateData(userModel);
    } catch (Exception e) {
      log.error(e.getMessage(), e);
    }
  }
}

原因:如果想要 Spring 事務能夠正常回滾,必須拋出它能夠處理的異常。如果沒有拋異常,則 Spring 認為程序是正常的。

8、拋出的異常,事務管理器處理不了,則不會回滾

示例代碼:

@Slf4j
@Service
public class UserService {
  @Transactional
  public void add(UserModel userModel) throws Exception {
    saveData(userModel);
    updateData(userModel);
  }
}

原因:@Transactional 默認的異常類型是 RuntimeException,如果出現非 RuntimeException,則 Spring 事務處理不了對應的異常,認為程序是正常的,則不會回滾事務,此時我們可以指定異常類型如 @Transactional(rollbackFor = Exception.class)

9、數據庫引擎不支持事務

比如 Mysql 中的 MyISAM 引擎是不支持事務操作的, InnoDB 才是支持事務的引擎

四、總結:

本文通過對 @Transactional 注解相關介紹,列舉出可能會出現事務失效的場景。發生最多就是自身調用、異常被吃、異常拋出類型不匹配這三個。由于平時業務繁重,有時候會忽視 @Transactional 注解使用規范,導致事務沒有生效或者沒有正常回滾,造成較大的數據異常。希望可以幫助大家日常使用 @Transactional 時避坑。

責任編輯:武曉燕 來源: 政采云技術
相關推薦

2023-09-27 16:22:51

SpringMySQL原子性

2021-04-14 15:17:08

Transaction代碼語言

2022-08-09 09:34:32

Spring開發

2022-08-08 17:38:45

Spring策略事務

2023-11-02 07:52:30

Java工具

2023-05-05 07:39:04

Spring事務面試

2022-02-14 16:53:57

Spring項目數據庫

2020-04-14 13:32:56

@Transacti失效場景

2021-06-26 14:59:13

SpringTransaction執行

2024-05-07 08:23:03

Spring@Async配置

2022-09-20 22:27:08

事務失效public 修飾

2023-07-05 08:45:18

Spring事務失效場景

2022-09-14 19:50:22

事務場景流程

2023-09-08 08:52:12

Spring注解事務

2023-08-29 10:51:44

2025-08-06 00:00:01

事務失效聲明式

2017-05-25 11:49:30

Android網絡請求OkHttp

2024-01-29 08:28:01

Spring事務失效

2024-09-09 08:29:25

2021-09-04 07:56:44

Spring事務失效
點贊
收藏

51CTO技術棧公眾號

亚洲另类在线制服丝袜| 欧美精品自拍| 欧美无砖专区一中文字| 伊人狠狠色丁香综合尤物| 99久久久国产精品无码免费| 夜久久久久久| 色婷婷综合久久久久| 男人的天堂免费| 成人va天堂| 亚洲黄色在线视频| 日韩av不卡在线播放| www黄色在线观看| 美女久久网站| 欧美激情视频一区二区| 一区二区伦理片| 亚洲精品一区二区三区在线| 一本在线高清不卡dvd| 亚洲激情免费视频| 成年网站在线| av中文字幕在线不卡| 国产日韩欧美综合| xxxx.国产| 欧美日韩国产色综合一二三四| 国产亚洲精品久久久久久牛牛| 丰满少妇一区二区三区专区| 国产精品毛片久久久久久久久久99999999 | 97国产成人精品视频| а天堂中文在线资源| 在线日韩网站| 日韩精品免费观看| 极品白嫩的小少妇| 国产一区二区视频在线看| 欧美色网站导航| 色综合av综合无码综合网站| 久久亚洲资源| 亚洲精品第一国产综合野| 亚洲欧美日韩国产成人综合一二三区| 亚洲欧美日本在线观看| 国产激情一区二区三区四区 | a看欧美黄色女同性恋| 欧美日韩高清影院| 黄色一级二级三级| 欧美gay囗交囗交| 狠狠爱在线视频一区| 久久国产精品视频在线观看| 日韩激情av| 亚洲欧美电影院| 中文字幕av久久| 免费观看在线黄色网| 中文字幕在线不卡视频| 亚洲欧洲一区二区| 午夜视频成人| 中文字幕中文字幕一区二区| 亚洲不卡中文字幕| 欧美日韩国产综合视频| 久久众筹精品私拍模特| 国产原创精品| 四虎精品在线| 久久久www免费人成精品| 欧美亚洲一级二级| 番号在线播放| 国产精品国产成人国产三级| 伊人久久大香线蕉午夜av| 免费在线观看av网站| 国产精品亲子伦对白| 一本色道久久综合亚洲精品婷婷 | 国产精品久久夜| 亚洲欧美99| 在线视频国产区| 午夜精品久久久| 国产在线青青草| 欧美va在线观看| 欧美久久久影院| 一级全黄裸体片| 欧美日韩导航| 国产一区二区日韩| 手机在线中文字幕| 黄色免费成人| 日韩av不卡在线| 一级黄色a毛片| 国产精品12区| 奇米影视首页 狠狠色丁香婷婷久久综合| 国产女人在线观看| 亚洲人123区| 3d动漫一区二区三区| 制服诱惑亚洲| 欧美一区二区三区在| 欧美一级片黄色| 成久久久网站| 欧美福利小视频| 国产成人无码专区| 国产在线看一区| 久久另类ts人妖一区二区| www.在线视频.com| 亚洲一区二区精品久久av| 午夜精品久久久内射近拍高清| 欧美大陆国产| 亚洲激情视频网| 黄色免费一级视频| 尹人成人综合网| 国产精品一二三视频| 成 人 免费 黄 色| 国产视频亚洲色图| 美女黄色免费看| 欧美日韩女优| 亚洲精品美女网站| 国产成人自拍网站| 久久亚洲二区| 国产高清在线精品一区二区三区| 岛国视频免费在线观看| 一级做a爱片久久| 亚洲污视频在线观看| 老司机成人在线| 久热精品在线视频| 国产精品午夜一区二区| av福利精品导航| 国风产精品一区二区| 激情亚洲影院在线观看| 亚洲国产精品专区久久| 黄色片在线观看网站| 奇米一区二区三区| 久久精品国产一区二区三区日韩 | 干b视频在线观看| 亚洲性图久久| 91精品天堂| 免费在线看黄网站| 欧美三级午夜理伦三级中视频| 女~淫辱の触手3d动漫| 激情偷拍久久| av一区二区在线看| av电影免费在线观看| 欧美精品在线观看播放| 亚洲色成人网站www永久四虎| 91久久黄色| 动漫一区二区在线| 制服丝袜中文字幕在线| 欧美一区午夜精品| 爱爱视频免费在线观看| 久久精品国产久精国产爱| 欧洲高清一区二区| 中文字幕 在线观看| 亚洲激情第一页| 日韩精品无码一区二区| 懂色一区二区三区免费观看| 精品一二三四五区| 91国内精品白嫩初高生| 久久久久久久久久久国产| 丰满熟妇人妻中文字幕| 亚洲午夜久久久久久久久电影院| 亚洲欧美激情一区二区三区| 亚洲有吗中文字幕| 亚洲专区国产精品| 日本在线观看大片免费视频| 欧美电影精品一区二区| 国产精选第一页| 91丨九色丨尤物| 国产精品69页| 成人综合久久| 91久久久精品| 日本电影在线观看| 日韩成人av一区| 7799精品视频天天看| 国产精品三级久久久久三级| 99中文字幕在线| 欧美日韩视频一区二区三区| 国产精品免费观看高清| 中文字幕乱码中文乱码51精品| 亚洲人成亚洲人成在线观看| 羞羞色院91蜜桃| 亚洲欧美视频在线观看视频| 午夜影院福利社| 先锋影音久久久| 午夜精品福利一区二区| 伊人久久一区| 韩国日本不卡在线| 高清福利在线观看| 制服视频三区第一页精品| 亚洲激情视频一区| 久久久久久一级片| 久久6免费视频| 亚洲第一在线| 亚洲黄色一区二区三区| 999久久久精品一区二区| 日本一区二区不卡| av网站在线免费看推荐| 日韩精品欧美激情| 一区二区日韩在线观看| 亚洲国产精品精华液网站| 性高潮久久久久久久| 国模大尺度一区二区三区| 成人综合视频在线| 亚洲国产精品久久久天堂 | 亚洲 另类 春色 国产| 欧美在线色视频| 久久久综合久久| 国产欧美一区在线| 亚洲精品第二页| 麻豆精品一区二区| 无码精品a∨在线观看中文| 欧美h版在线| 久久99精品久久久久子伦| 成人亚洲精品| 国产精品99久久久久久久久久久久 | 女性女同性aⅴ免费观女性恋| 成人激情开心网| 久久青青草原一区二区| 日韩在线精品强乱中文字幕| 国产suv精品一区二区| 俺来也官网欧美久久精品| 日韩三级成人av网| 久久久久久久影视| 亚洲成年人在线| 国产wwwwwww| 欧美日韩一级大片网址| 少妇高潮av久久久久久| 亚洲二区视频在线| 久久久久久久久毛片| 国产精品卡一卡二| 国产午夜福利一区| 久久品道一品道久久精品| av在线播放网址| 高清av一区二区| 99久久综合网| 国产一区在线观看麻豆| 一级黄色特级片| 欧美aa在线视频| 免费看a级黄色片| 天堂久久一区二区三区| 免费无码av片在线观看| av成人黄色| 亚洲熟妇无码一区二区三区| 国内揄拍国内精品久久| 中文字幕乱码免费| 亚洲色图国产| 99re8这里只有精品| 欧美电影一区| 日本成人性视频| 久久中文亚洲字幕| 一区二区免费电影| 羞羞答答成人影院www| 中文精品视频一区二区在线观看| 成人在线电影在线观看视频| 久久亚洲免费| 国产精品欧美三级在线观看| 蜜桃视频在线观看成人| 欧美激情在线免费| 日韩欧美亚洲在线| 日韩一区二区中文| 一区二区三区视频| 久久久久久久久99精品大| 久久久一二三四| 欧美成人日本| 久久99中文字幕| 国产农村妇女精品一区二区| 日韩av一二三四区| 日本欧美在线观看| www.污网站| 国产69精品久久久久毛片| 深田咏美中文字幕| 91网址在线看| 手机看片国产日韩| 亚洲乱码一区二区三区在线观看| 久久久久久久久久综合| 欧美日韩中文在线观看| 超碰在线97观看| 91精品国产色综合久久久蜜香臀| 国产高清免费在线观看| 亚洲黄页网在线观看| 国产乱子伦三级在线播放| www.欧美精品一二三区| 日本h片在线观看| 日本一区二区三区在线播放 | 国产伦一区二区三区色一情| 一呦二呦三呦国产精品| 亚洲永久一区二区三区在线| 欧美午夜不卡| 日韩精品一区二区三区色欲av| 蜜臀av亚洲一区中文字幕| 国产xxxxhd| 91日韩在线专区| 51精品免费网站| 精品国产乱码久久久久久婷婷| 亚洲精品毛片一区二区三区| 欧美一区二区三区视频免费| 亚洲av毛片成人精品| 日韩中文字幕在线视频播放| 91九色国产在线播放| 国产精品久久久久77777| 欧美三级一区| 日本一区二区三区视频免费看| 911久久香蕉国产线看观看| 青青青青草视频| 韩国一区二区三区| 日本黄色网址大全| 亚洲精品菠萝久久久久久久| 欧美一区二区三区不卡视频| 日韩你懂的在线观看| 六十路在线观看| 欧美激情一区二区三区久久久| 欧美日韩精品免费观看视完整| 91一区二区三区| 精品一级毛片| 久草资源站在线观看| 国产成人av一区二区三区在线| 欧美老女人性生活视频| 精品日本高清在线播放| 99久久精品国产成人一区二区| 亚洲欧美日韩国产成人| 好吊日av在线| 国产欧美欧洲在线观看| 丝袜美腿综合| 日本阿v视频在线观看| 精品中文字幕一区二区小辣椒| 美女又爽又黄视频毛茸茸| 亚洲自拍欧美精品| 97精品人妻一区二区三区| 亚洲欧美激情在线视频| 黄色aa久久| 国产亚洲情侣一区二区无| 亚洲成人国产| 在线观看免费av网址| 日本一区二区成人| 久久久久女人精品毛片九一| 精品粉嫩超白一线天av| 色婷婷av在线| 114国产精品久久免费观看| 久久影院100000精品| 一区二区三区 欧美| 国产午夜精品福利| 免费看污视频的网站| 亚洲欧美日韩精品久久奇米色影视| 精品精品导航| 国产欧美日韩综合一区在线观看 | 日韩在线综合网| 成人av电影在线观看| 国产一级片网址| 精品久久国产97色综合| 国产写真视频在线观看| 91精品国产综合久久香蕉| 成人在线电影在线观看视频| 最近中文字幕一区二区| 欧美国产禁国产网站cc| 少妇又紧又色又爽又刺激视频| 在线观看免费高清视频97| 3d欧美精品动漫xxxx无尽| 日韩在线第一区| 蜜乳av一区二区| 男人在线观看视频| 在线播放亚洲一区| 污片视频在线免费观看| 99se婷婷在线视频观看| 精品动漫3d一区二区三区免费| 性猛交╳xxx乱大交| 欧美日韩国产一区二区| 男男电影完整版在线观看| 国产精品精品久久久久久| 清纯唯美亚洲综合一区| 亚洲一区二区偷拍| 亚洲福中文字幕伊人影院| 日本大片在线观看| 国产精品美腿一区在线看| 日韩成人激情| 久久久久久国产精品日本| 亚洲电影在线播放| 国产在线观看精品一区| 成人www视频在线观看| 欧美高清日韩| 波多野结衣影院| 欧美综合亚洲图片综合区| 欧美激情黑人| 国产精品久久久久久久久婷婷 | 一级日本不卡的影视| 深夜福利免费在线观看| 国产精品男人的天堂| 欧美在线免费一级片| 噜噜噜在线视频| 欧美三级三级三级| 青草在线视频| 视频一区二区在线| 国产suv精品一区二区6| 神马久久久久久久 | 视频一区视频二区视频三区视频四区国产 | 成人无码av片在线观看| 欧美一级二级三级乱码| 中文字幕一区久| 日本高清xxxx| 2020国产精品久久精品美国| 91丨porny丨在线中文 | 亚洲老女人av| 亚洲福中文字幕伊人影院| 1024视频在线| 加勒比在线一区二区三区观看| 麻豆freexxxx性91精品| www..com国产| 久久精品人人做人人爽| 嫩草一区二区三区| 精产国品一区二区三区| 欧美午夜影院一区| а√在线中文在线新版| 中文字幕一区综合|