日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-09-28 10:02:49 368觀看
導讀一、事務的本質1、何為事務管理數據庫事務,是指作為單個邏輯工作單元執行的一系列操作,要么完全地執行,要么完全地不執行。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過

一、事務的本質

1、何為事務管理

數據庫事務,是指作為單個邏輯工作單元執行的一系列操作,要么完全地執行,要么完全地不執行。yQq28資訊網——每日最新資訊28at.com

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

一個邏輯工作單元要成為事務,必須滿足所謂的 ACID (原子性、一致性、隔離性和持久性)屬性。事務是數據庫運行中的邏輯工作單位。yQq28資訊網——每日最新資訊28at.com

2、 Spring 中的事務管理

實際工作中我們更多的是結合 Spring 來做項目的這時我們要滿足的情況是這種。yQq28資訊網——每日最新資訊28at.com

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

可以看出我們在 Service 中是可能調用多個 Dao 的方法來操作數據庫中的數據的,我們要做的就是要保證 UserService 中的 addUser() 方法中的相關操作滿足事務的要求yQq28資訊網——每日最新資訊28at.com

常見的開啟 Spring 事務方式:@TransactionalyQq28資訊網——每日最新資訊28at.com

二、 @Transactional 注解

1、原理:

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

底層實現:yQq28資訊網——每日最新資訊28at.com

圖片圖片yQq28資訊網——每日最新資訊28at.com

2、屬性介紹:

隔離級別( @Transactional ( isolation = Isolation.DEFAULT ) ): 為了解決數據庫容易出現的問題,分級加鎖處理策略yQq28資訊網——每日最新資訊28at.com

隔離級別
yQq28資訊網——每日最新資訊28at.com

描述
yQq28資訊網——每日最新資訊28at.com

ISOLATION_DEFAULTyQq28資訊網——每日最新資訊28at.com

Spring 默認隔離級別,以連接的數據庫的事務隔離級別為準;Mysql (可重復讀)
yQq28資訊網——每日最新資訊28at.com

ISOLATION_READ_UNCOMMITTEDyQq28資訊網——每日最新資訊28at.com

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

ISOLATION_READ_COMMITTEDyQq28資訊網——每日最新資訊28at.com

讀已提交:是指一個事務只能讀取另外一個事務已經提交的數據,不能讀取未提交的數據
yQq28資訊網——每日最新資訊28at.com

ISOLATION_REPEATABLE_READyQq28資訊網——每日最新資訊28at.com

可重復讀:目標是克服讀寫提交中出現的不可重復讀的現象,因為在讀寫提交的時候,可能出現一些值的變化,影響當前事務的執行
yQq28資訊網——每日最新資訊28at.com

ISOLATION_SERIALIZABLEyQq28資訊網——每日最新資訊28at.com

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

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

是否只讀 ( @Transactional ( readOnly = true ) ):表示這個事務只讀取數據但不更新數據yQq28資訊網——每日最新資訊28at.com

回滾機制( @Transactional ( rollbackFor = Exception.class ):定義遇到異常時回滾策略yQq28資訊網——每日最新資訊28at.com

傳播機制( @Transactional ( propagation = Propagation.REQUIRED ): 對事務的傳播特性進行定義,共有 7 種類型 (一個事務內調用另外一個事務)yQq28資訊網——每日最新資訊28at.com

事務行為
yQq28資訊網——每日最新資訊28at.com

說明
yQq28資訊網——每日最新資訊28at.com

PROPAGATION_REQUIRED
yQq28資訊網——每日最新資訊28at.com

如果當前上下文中存在事務,那么加入該事務,如果不存在事務,創建一個事務,這是默認的傳播屬性值
yQq28資訊網——每日最新資訊28at.com

PROPAGATION_SUPPORTS
yQq28資訊網——每日最新資訊28at.com

如果當前上下文存在事務,則支持事務加入事務,如果不存在事務,則使用非事務的方式執行
yQq28資訊網——每日最新資訊28at.com

PROPAGATION_MANDATORY
yQq28資訊網——每日最新資訊28at.com

支持當前事務,假設當前沒有事務,就拋出異常
yQq28資訊網——每日最新資訊28at.com

PROPAGATION_REQUIRES_NEW
yQq28資訊網——每日最新資訊28at.com

每次都會新建一個事務,并且同時將上下文中的事務掛起,執行當前新建事務完成以后,上下文事務恢復再執行
yQq28資訊網——每日最新資訊28at.com

PROPAGATION_NOT_SUPPORTED
yQq28資訊網——每日最新資訊28at.com

如果當前上下文中存在事務,則掛起當前事務,然后新的方法在沒有事務的環境中執行
yQq28資訊網——每日最新資訊28at.com

PROPAGATION_NEVER
yQq28資訊網——每日最新資訊28at.com

如果當前上下文中存在事務,則拋出異常,否則在無事務環境上執行代碼
yQq28資訊網——每日最新資訊28at.com

PROPAGATION_NESTED
yQq28資訊網——每日最新資訊28at.com

如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與 PROPAGATION_REQUIRED 類似的操作。
yQq28資訊網——每日最新資訊28at.com

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

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

示例代碼:yQq28資訊網——每日最新資訊28at.com

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

原因:Spring 要求被代理方法必須得是 public 的yQq28資訊網——每日最新資訊28at.com

圖片yQq28資訊網——每日最新資訊28at.com

也就是說,如果我們自定義的事務方法(即目標方法),它的訪問權限不是 public,而是 private、 default 或 protected 的話, Spring 則不會提供事務功能yQq28資訊網——每日最新資訊28at.com

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

示例代碼:yQq28資訊網——每日最新資訊28at.com

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

原因:yQq28資訊網——每日最新資訊28at.com

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

注意:如果某個方法是 static 修飾的,同樣無法通過動態代理,變成事務方法。yQq28資訊網——每日最新資訊28at.com

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

示例代碼:yQq28資訊網——每日最新資訊28at.com

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

原因:yQq28資訊網——每日最新資訊28at.com

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

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

示例代碼:yQq28資訊網——每日最新資訊28at.com

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

原因:yQq28資訊網——每日最新資訊28at.com

使用 Spring 事務的前提是:對象要被 Spring IOC 管理,需要創建 bean 實例yQq28資訊網——每日最新資訊28at.com

5、多線程調用

示例代碼:yQq28資訊網——每日最新資訊28at.com

@Servicepublic 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();  }}@Servicepublic class RoleService {  @Transactional  public void doOtherThing() {  }}

原因:同一個事務,其實是指同一個數據庫連接,只有擁有同一個數據庫連接才能同時提交和回滾。如果在不同的線程,拿到的數據庫連接肯定是不一樣的,所以是不同的事務。yQq28資訊網——每日最新資訊28at.com

6、錯誤的傳播特性

示例代碼:yQq28資訊網——每日最新資訊28at.com

@Servicepublic 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();  }}@Servicepublic class RoleService {  @Transactional(propagation = Propagation.NEVER)  public void doOtherThing() {  }}

原因:RoleService 中 doOtherThing() 方法上設置的事物傳播類型為 Propagation.NEVER,即存在事務就拋出異常yQq28資訊網——每日最新資訊28at.com

7、自己吞了異常

示例代碼:yQq28資訊網——每日最新資訊28at.com

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

原因:如果想要 Spring 事務能夠正常回滾,必須拋出它能夠處理的異常。如果沒有拋異常,則 Spring 認為程序是正常的。yQq28資訊網——每日最新資訊28at.com

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

示例代碼:yQq28資訊網——每日最新資訊28at.com

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

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

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

比如 Mysql 中的 MyISAM 引擎是不支持事務操作的, InnoDB 才是支持事務的引擎yQq28資訊網——每日最新資訊28at.com

四、總結:

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

本文鏈接:http://m.www897cc.com/showinfo-26-11732-0.html@Transactional注解使用以及事務失效的場景

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 玩轉SpringBoot—自動裝配解決Bean的復雜配置

下一篇: React中的依賴注入,看這一篇就夠了!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲成人在线网| 国产精品色网| 另类尿喷潮videofree| 欧美xx视频| 欧美日韩三级| 国产精品久久久久久久久久妞妞 | 久久国产精品免费一区| 久久精品国产77777蜜臀| 久久乐国产精品| 欧美激情中文字幕乱码免费| 国产精品久久久99| 狠狠久久亚洲欧美| 亚洲看片免费| 亚洲一区在线视频| 久久精品国产91精品亚洲| 欧美成人亚洲成人| 国产精品国产三级国产普通话蜜臀| 国产日韩欧美一区二区三区在线观看 | 亚洲一区在线观看视频| 久久精品亚洲精品| 欧美理论电影在线播放| 国产日韩欧美日韩| 最新国产の精品合集bt伙计| 欧美午夜一区| 国产一区二区久久久| 亚洲精品欧美精品| 久久精品道一区二区三区| 欧美精品综合| 国内久久婷婷综合| 亚洲色在线视频| 美腿丝袜亚洲色图| 国产九色精品成人porny| 亚洲欧洲精品一区二区| 午夜在线视频一区二区区别 | 韩国欧美一区| aⅴ色国产欧美| 久久免费视频网站| 欧美午夜视频网站| 亚洲国产一区二区三区在线播 | 国产精品伦一区| 亚洲黄色视屏| 欧美在线视频导航| 欧美亚洲第一页| 91久久精品国产91久久| 欧美在线999| 欧美视频日韩| 亚洲精选一区| 久久亚洲色图| 国产视频自拍一区| 亚洲私人影院| 欧美成人性网| 欧美激情一级片一区二区| 国产日韩一级二级三级| 中国女人久久久| 欧美日本一区二区高清播放视频| 在线电影院国产精品| 欧美一区二视频在线免费观看| 欧美日韩一区二区免费视频| 亚洲国产三级| 久久综合网络一区二区| 国产日韩欧美综合在线| 午夜精品久久久久久久99樱桃| 欧美日韩一区二区免费视频| 亚洲人成在线观看一区二区| 久久一二三四| 国产主播一区| 久久aⅴ国产欧美74aaa| 国产精品久久久久天堂| 一本综合久久| 欧美精品成人91久久久久久久| 亚洲国产经典视频| 毛片av中文字幕一区二区| 很黄很黄激情成人| 久久久精品国产免大香伊| 国产色视频一区| 午夜一区二区三视频在线观看| 国产精品蜜臀在线观看| 亚洲天天影视| 国产精品盗摄一区二区三区| 亚洲午夜精品福利| 欧美三级电影一区| 一区二区三区欧美视频| 欧美三级视频在线观看| 日韩视频一区二区三区| 欧美日韩高清区| 国产精品99久久久久久人| 欧美日韩视频在线一区二区 | 亚洲主播在线播放| 国产精品每日更新在线播放网址| 亚洲一区二区三区在线看| 国产精品福利在线观看网址| 亚洲在线观看免费| 国产精品腿扒开做爽爽爽挤奶网站| 午夜精品国产精品大乳美女| 国产视频在线观看一区二区| 久久久久久久久久久成人| 在线观看欧美| 欧美久久久久中文字幕| 亚洲视频视频在线| 国产精品丝袜91| 欧美在线视频全部完| 国产在线视频欧美| 久久尤物视频| 最新日韩中文字幕| 欧美日韩综合另类| 午夜影院日韩| 在线成人av.com| 亚洲乱码国产乱码精品精天堂| 欧美日韩精选| 亚洲欧美日韩在线观看a三区| 国产日韩欧美中文| 久色成人在线| 亚洲美女黄色| 国产老女人精品毛片久久| 久久精品女人| 日韩亚洲欧美在线观看| 国产精品视频导航| 久久久久久久97| 亚洲精品看片| 国产麻豆精品视频| 麻豆成人在线播放| 在线中文字幕不卡| 国产一区二区三区四区三区四| 免费观看日韩| 亚洲午夜免费视频| 国内外成人免费激情在线视频网站| 女生裸体视频一区二区三区| 亚洲视频碰碰| 在线观看欧美亚洲| 欧美日韩一区二区三区免费| 欧美亚洲日本国产| 91久久中文字幕| 国产精品久久网| 老司机67194精品线观看| 一区二区激情| 黄色精品一区| 欧美午夜无遮挡| 久久婷婷蜜乳一本欲蜜臀| 一区二区三区四区五区精品| 樱桃国产成人精品视频| 欧美无砖砖区免费| 麻豆九一精品爱看视频在线观看免费| 亚洲免费久久| 国内欧美视频一区二区| 欧美日韩精品中文字幕| 久久亚洲私人国产精品va| 一区二区三区免费网站| 亚洲大胆人体在线| 国产精品午夜国产小视频| 欧美国产视频在线| 欧美一二区视频| 在线一区视频| 亚洲大胆视频| 国产日本欧美一区二区三区| 欧美激情一区二区久久久| 欧美一级片在线播放| 99国产精品国产精品久久| 韩国三级电影一区二区| 国产精品成人免费| 欧美v日韩v国产v| 久久www免费人成看片高清| 妖精视频成人观看www| 在线看不卡av| 国产日韩欧美二区| 欧美日韩在线一区二区三区| 免费亚洲电影在线观看| 欧美一区二视频| 亚洲在线观看免费视频| 亚洲精选在线| 亚洲国产成人久久综合| 国产午夜精品一区理论片飘花 | 亚洲福利在线看| 国产午夜精品全部视频在线播放| 欧美日韩国产在线观看| 麻豆精品在线播放| 欧美中文字幕久久| 亚洲免费网址| 9久草视频在线视频精品| 一区二区亚洲精品国产| 国产欧美二区| 欧美午夜精品| 欧美日韩一本到| 欧美国产日韩精品| 免费成人高清| 久久久久综合网| 欧美自拍偷拍| 午夜在线不卡| 亚洲欧美一区二区三区极速播放 | 久久超碰97中文字幕| 亚洲一区尤物| 一区二区三区日韩精品视频| 国产精品久久午夜| 欧美日本一区| 欧美激情一区二区三区全黄| 免播放器亚洲一区| 久久亚洲私人国产精品va媚药| 久久久99久久精品女同性| 一区久久精品| 亚洲一级黄色| 国产精品乱人伦一区二区| 午夜精品视频在线观看| 国产精品久久| 亚洲女人小视频在线观看| 欧美日韩亚洲成人|