亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術文章
文章詳情頁

Spring事務失效的幾種原因

瀏覽:47日期:2023-08-14 10:20:58

數據庫引擎不支持事務

在MySQL數據庫中有幾種引擎(InnoDB,MyISAM,Memory等等),僅僅InnoDB支持事務,如果數據庫底層都不支持事務的話,那么再怎么折騰都是白搭.

@transactional加在private方法上

@Transactional只能加在public方法上,如果需要在private方法中加入事務,可以使用Aspect配transactionManager使用.

本類方法調本類另一個方法

例如:

@Servicepublic class UserServiceImpl implements UserService { @Transactional public void update(User user) { //check updateUserInfo(user); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void updateUser(User user) { // update user }}

@Transactional(propagation = Propagation.REQUIRES_NEW)是無效的,在Spring中是使用代理的方式實現事務,發生自身調用的時候,沒有經過Spring的代理,自然事務失效.

不支持事務

@Servicepublic class UserServiceImpl implements UserService { @Transactional(propagation = Propagation.NOT_SUPPORTED) public void update(User user) { //do some action }}

@Transactional(propagation = Propagation.NOT_SUPPORTED)表示如果當前存在事務就掛起,以沒有事務的方式運行,主動不支持事務了,那么再怎么操作也是白搭. 此處貼下Spring的傳播行為:

/** * Support a current transaction, create a new one if none exists. * Analogous to EJB transaction attribute of the same name. * <p>This is the default setting of a transaction annotation. */ REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), /** * Support a current transaction, execute non-transactionally if none exists. * Analogous to EJB transaction attribute of the same name. * <p>Note: For transaction managers with transaction synchronization, * PROPAGATION_SUPPORTS is slightly different from no transaction at all, * as it defines a transaction scope that synchronization will apply for. * As a consequence, the same resources (JDBC Connection, Hibernate Session, etc) * will be shared for the entire specified scope. Note that this depends on * the actual synchronization configuration of the transaction manager. * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#setTransactionSynchronization */ SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), /** * Support a current transaction, throw an exception if none exists. * Analogous to EJB transaction attribute of the same name. */ MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), /** * Create a new transaction, and suspend the current transaction if one exists. * Analogous to the EJB transaction attribute of the same name. * <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box * on all transaction managers. This in particular applies to * {@link org.springframework.transaction.jta.JtaTransactionManager}, * which requires the {@code javax.transaction.TransactionManager} to be * made available to it (which is server-specific in standard Java EE). * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager */ REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW), /** * Execute non-transactionally, suspend the current transaction if one exists. * Analogous to EJB transaction attribute of the same name. * <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box * on all transaction managers. This in particular applies to * {@link org.springframework.transaction.jta.JtaTransactionManager}, * which requires the {@code javax.transaction.TransactionManager} to be * made available to it (which is server-specific in standard Java EE). * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager */ NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), /** * Execute non-transactionally, throw an exception if a transaction exists. * Analogous to EJB transaction attribute of the same name. */ NEVER(TransactionDefinition.PROPAGATION_NEVER), /** * Execute within a nested transaction if a current transaction exists, * behave like PROPAGATION_REQUIRED else. There is no analogous feature in EJB. * <p>Note: Actual creation of a nested transaction will only work on specific * transaction managers. Out of the box, this only applies to the JDBC * DataSourceTransactionManager when working on a JDBC 3.0 driver. * Some JTA providers might support nested transactions as well. * @see org.springframework.jdbc.datasource.DataSourceTransactionManager */ NESTED(TransactionDefinition.PROPAGATION_NESTED);

異常被catch

@Servicepublic class UserServiceImpl implements UserService { @Transactional public void update(User user) { try{ }catch(Exception e){ log.error(e.getMessage(),e); } }}

觸發回滾的操作是被接收到異常,一般我們會在@Transactional后面加上rollbackFor或者noRollbackForClassName來指明觸發回滾的異常,但是如果在代碼中給catch了異常,那么對于Spring代理來說就這個方法從頭到尾都沒有問題,自然不會觸發回滾.

異常類型錯誤

@Servicepublic class UserServiceImpl implements UserService { @Transactional public void update(User user) { try{ }catch(Exception e){ log.error(e.getMessage(),e); throw new Exception(e.getMessage()); } }}

以上方式throw new Exception(e.getMessage());事務也是無效的,主要原因是事務回滾的條件是throw 運行時異常(RunTimeException).如果需要其他異常也回滾,需要在@Transactional后面加上rollbackFor或者noRollbackForClassName來指明觸發回滾的異常.

沒有被Spring管理

不在Spring環境下,自然不受Spring的管理,事務管理器也當然失去了作用.

沒有配置TransactionManager

需要對當前數據源配置事務管理器,尤其是在多數據源的情況下.

以上就是Spring事務失效的幾種原因的詳細內容,更多關于Spring事務失效的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
主站蜘蛛池模板: 久热久草 | 亚洲综合性 | 国产高清在线 | 岛国搬运工最新网地址 | 欧美精品久久天天躁 | 一区二区三区 亚洲区 | 国产自制一区 | 成人欧美网站 | 久久九九国产精品怡红院 | 看片亚洲| 99久久在线 | 18性欧美69 | 久久久久999 | 美女扒开双腿让男人爽透视频 | 视频一区二区在线 | 国产精品一久久香蕉国产线看 | 香蕉视频亚洲一级 | 国产手机在线视频 | 国产人成午夜免费噼啪视频 | 性欧美17一18sex性高清播放 | 伊人黄网 | 国产欧美一区二区三区视频在线观看 | 久久久久亚洲精品中文字幕 | 高清不卡毛片免费观看 | 亚洲国产成人最新精品资源 | 妖精www成人动漫在线观看 | 97免费视频观看 | 成人性视频在线三级 | 性欧美欧美之巨大69 | 狠狠色丁香婷婷综合 | 黄色在线视屏 | 午夜私人影院免费体验区 | 女子张开腿让男人桶视频 | 国产91精品久久久久久久 | 精品久久久久中文字幕日本 | 欧美午夜a级精美理论片 | 久久综合久久美利坚合众国 | 久久91精品国产91久久 | 欧美性色黄大片一级毛片视频 | 中国一级毛片aaa片 中国一级毛片录像 | 美女黄色毛片免费看 |