中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring事務失效的原因是什么

發布時間:2021-10-25 10:14:57 來源:億速云 閱讀:109 作者:iii 欄目:web開發

本篇內容主要講解“Spring事務失效的原因是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spring事務失效的原因是什么”吧!

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

這里以 MySQL 為例,其 MyISAM 引擎是不支持事務操作的,InnoDB 才是支持事務的引擎,一般要支持事務都會使用 InnoDB。

根據 MySQL 的官方文檔:

  • https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html

從 MySQL 5.5.5  開始的默認存儲引擎是:InnoDB,之前默認的都是:MyISAM,所以這點要值得注意,底層引擎不支持事務再怎么搞都是白搭。

2、沒有被 Spring 管理

如下面例子所示:

// @Service public class OrderServiceImpl implements OrderService {      @Transactional     public void updateOrder(Order order) {         // update order     }      }

如果此時把 @Service 注解注釋掉,這個類就不會被加載成一個 Bean,那這個類就不會被 Spring 管理了,事務自然就失效了。

3、方法不是 public 的

以下來自 Spring 官方文檔:

  • When using proxies, you should apply the @Transactional annotation only to  methods with public visibility. If you do annotate protected, private or  package-visible methods with the @Transactional annotation, no error is raised,  but the annotated method does not exhibit the configured transactional settings.  Consider the use of AspectJ (see below) if you need to annotate non-public  methods.

大概意思就是 @Transactional 只能用于 public 的方法上,否則事務不會失效,如果要用在非 public 方法上,可以開啟  AspectJ 代理模式。

4、自身調用問題

來看兩個示例:

@Service public class OrderServiceImpl implements OrderService {      public void update(Order order) {         updateOrder(order);     }          @Transactional     public void updateOrder(Order order) {         // update order     }      }

update方法上面沒有加 @Transactional 注解,調用有 @Transactional 注解的 updateOrder  方法,updateOrder 方法上的事務管用嗎?

再來看下面這個例子:

@Service public class OrderServiceImpl implements OrderService {      @Transactional     public void update(Order order) {         updateOrder(order);     }          @Transactional(propagation = Propagation.REQUIRES_NEW)     public void updateOrder(Order order) {         // update order     }      }

這次在 update 方法上加了 @Transactional,updateOrder 加了 REQUIRES_NEW  新開啟一個事務,那么新開的事務管用么?

這兩個例子的答案是:不管用!

因為它們發生了自身調用,就調該類自己的方法,而沒有經過 Spring 的代理類,默認只有在外部調用事務才會生效,這也是老生常談的經典問題了。

這個的解決方案之一就是在的類中注入自己,用注入的對象再調用另外一個方法,這個不太優雅,另外一個可行的方案可以參考《Spring  如何在一個事務中開啟另一個事務?》這篇文章。

5、數據源沒有配置事務管理器

@Bean public PlatformTransactionManager transactionManager(DataSource dataSource) {     return new DataSourceTransactionManager(dataSource); }

如上面所示,當前數據源若沒有配置事務管理器,那也是白搭!

6、不支持事務

來看下面這個例子:

@Service public class OrderServiceImpl implements OrderService {      @Transactional     public void update(Order order) {         updateOrder(order);     }          @Transactional(propagation = Propagation.NOT_SUPPORTED)     public void updateOrder(Order order) {         // update order     }      }

Propagation.NOT_SUPPORTED: 表示不以事務運行,當前若存在事務則掛起。

都主動不支持以事務方式運行了,那事務生效也是白搭!

7、異常被吃了

這個也是出現比較多的場景:

// @Service public class OrderServiceImpl implements OrderService {      @Transactional     public void updateOrder(Order order) {         try {             // update order         } catch {                      }     }      }

把異常吃了,然后又不拋出來,事務怎么回滾吧!

8、異常類型錯誤

上面的例子再拋出一個異常:

// @Service public class OrderServiceImpl implements OrderService {      @Transactional     public void updateOrder(Order order) {         try {             // update order         } catch {             throw new Exception("更新錯誤");         }     }      }

這樣事務也是不生效的,因為默認回滾的是:RuntimeException,如果你想觸發其他異常的回滾,需要在注解上配置一下,如:

@Transactional(rollbackFor = Exception.class)

這個配置僅限于 Throwable 異常類及其子類。

到此,相信大家對“Spring事務失效的原因是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金昌市| 彩票| 龙泉市| 车致| 呼图壁县| 临城县| 吉林市| 秦皇岛市| 山阳县| 嘉鱼县| 宜良县| 岳阳县| 友谊县| 甘泉县| 格尔木市| 陆川县| 麻栗坡县| 乡城县| 舟山市| 白朗县| 西藏| 新建县| 石渠县| 大冶市| 疏附县| 独山县| 荔波县| 平乡县| 清新县| 喜德县| 贵德县| 房产| 万源市| 西城区| 道孚县| 襄垣县| 乃东县| 白河县| 乡城县| 芜湖县| 贡嘎县|