成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

總結(jié)一下Spring中事務(wù)失效的八種場景

開發(fā) 前端
在今天的文章中總結(jié)了使用 @Transactional注解導(dǎo)致事務(wù)失效的幾個常見場景,如果 @Transactional事務(wù)不生效,則可以根據(jù)這幾種情形排查一下,其實(shí)次數(shù)最多的也就是發(fā)生自身調(diào)用、異常被捕獲、異常拋出類型不匹配這幾種場景。

1. 數(shù)據(jù)庫引擎不支持事務(wù)

這里以 MySQL為例,MyISAM引擎是不支持事務(wù)操作的,一般要支持事務(wù)都會使用InnoDB引擎,根據(jù)MySQL 的官方文檔說明,從MySQL 5.5.5 開始的默認(rèn)存儲引擎是 InnoDB,之前默認(rèn)的都是 MyISAM,所以這一點(diǎn)要值得注意,如果底層引擎不支持事務(wù),那么再怎么設(shè)置也沒有用。

2.沒有被 Spring 管理

示例如下:

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

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

3. 方法不是 public 的

@Transactional注解只能用干public 的方法上,否則事多不會生效,如果要用在非public的方法上,則可以開啟基于 AspcetJ 框架的靜態(tài)代理模式。

4.發(fā)生自身調(diào)用

示例如下:

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

@Transactional
public void updateOrder(0rder order) {
    // update order
  }
}

update 方法上面沒有加 @Transactional 注解,如果調(diào)用有 @Transactional 注解的updateOrder 方法,那么 updateOrder 方法上的事務(wù)還可以生效嗎?   這里大家可以先想一想,后面會揭曉答案。

再來看下面這個例子:

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

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateOrder(0rder order) {
     updateOrder(order);
  }
}

這次在 update 方法上加了 @Transactional, 如果在 updateOrder 上加了 REOUIRES_NEW新開啟一個事務(wù),那么新開啟的事務(wù)可以生效嗎?

這兩個例子中的事務(wù)都不會生效,因?yàn)樗鼈儼l(fā)生了自身調(diào)用,就調(diào)用了該類自己的方法,而沒有經(jīng)過Spring的代理類,默認(rèn)只有調(diào)用外部代理類的方法,事務(wù)才會生效,這也是老生常談的問題了。

這個問題的解決方案之一就是在事務(wù)所在的類中注入自己,用往入的對象再調(diào)用另外一個方法,這個不太優(yōu)雅,在Spring 中可以在當(dāng)前線程中暴露并獲取當(dāng)前代理類,通過在啟動類上添加以下注解來啟用暴露代理類,如下面的示例所示。

@EnableAspectJAutoProxy(exposeProxy = true)

然后通過以下代碼獲取當(dāng)前代理類,并調(diào)用代理類的事務(wù)方法:

((0rderService) AopContext.currentProxy()).updateOrder();

Spring 默認(rèn)只有調(diào)用 Spring代理類的public 方法,事務(wù)才能生效。

5.沒有配置事務(wù)管理器

如果沒有配置以下DataSourceTransactionManager數(shù)據(jù)源事務(wù)管理器,那么事務(wù)也不會生效 :

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

但在 Spring Boot 中只要引入了 spring-boot-starter-data-jdbc 啟動器依賴就會自動配置DataSourceTransactionManager數(shù)據(jù)源事務(wù)管理器,所以 Spring Boot框架不存在這個問題,但在傳統(tǒng)的 Spring 框架中需要注意。

6. 設(shè)置了不支持事務(wù)

示例如下:

@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表示當(dāng)前方法不以事務(wù)方式運(yùn)行,當(dāng)前若存在事務(wù)則掛起,這就是主動不支持以事務(wù)方式運(yùn)行了。

7. 異常沒有被拋出

示例如下:

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

這個方法把異常給捕獲了,但沒有拋出來,所以事務(wù)不會回滾,只有捕捉到異常事務(wù)才會生效。

8. 異常類型不匹配

示例如下:

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

因?yàn)?Spring 默認(rèn)回滾的是 RuntimeException 異常,和程序拋出的 Exception 異常不匹配,所以事務(wù)也是不生效的。如果要觸發(fā)默認(rèn) RuntimeException之外異常的回滾,則需要在 @Transactiona事務(wù)注解上指定異常類,示例如下:

@Transactional(rollbackFor = Exception.class)

在今天的文章中總結(jié)了使用 @Transactional注解導(dǎo)致事務(wù)失效的幾個常見場景,如果 @Transactional事務(wù)不生效,則可以根據(jù)這幾種情形排查一下,其實(shí)次數(shù)最多的也就是發(fā)生自身調(diào)用、異常被捕獲、異常拋出類型不匹配這幾種場景。

責(zé)任編輯:武曉燕 來源: JAVA日知錄
相關(guān)推薦

2024-09-09 08:29:25

2024-01-29 08:28:01

Spring事務(wù)失效

2022-02-14 16:53:57

Spring項(xiàng)目數(shù)據(jù)庫

2021-09-04 07:56:44

Spring事務(wù)失效

2021-12-13 11:12:41

Spring事務(wù)失效

2022-12-06 10:39:43

Spring事務(wù)失效

2022-09-27 21:14:54

Spring事務(wù)傳播機(jī)制

2024-04-19 13:57:30

索引數(shù)據(jù)庫查詢

2021-04-14 15:17:08

Transaction代碼語言

2023-11-20 13:52:00

Redis數(shù)據(jù)庫

2025-02-10 00:27:54

2024-05-07 08:23:03

Spring@Async配置

2023-05-26 07:19:49

Spring聲明式事務(wù)

2023-02-04 20:08:24

前端開發(fā)

2023-09-28 09:07:54

注解失效場景

2023-04-03 10:24:00

spring事務(wù)場景

2022-04-13 20:53:15

Spring事務(wù)管理

2021-04-15 08:01:27

Spring聲明式事務(wù)

2022-09-22 09:57:20

Spring事務(wù)失效

2022-09-05 07:06:59

BeanSpring
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产影音先锋 | 国产原创视频 | 成人一区二区三区在线观看 | 国产精品亚洲综合 | 久久亚洲天堂 | 亚洲h在线观看 | 亚洲色图在线观看 | 国产免费一区 | 国产免费一级一级 | 日韩高清中文字幕 | 精品久久一区 | 91精品久久久久久久久久 | 国产精品区一区二 | 成人h视频在线 | 国产区在线观看 | 91精品国产一区二区三区 | 国产精品久久久久久久毛片 | 久草院线| 国产清纯白嫩初高生在线播放视频 | 亚洲一区二区在线 | 日本福利在线观看 | 欧美一二三区 | 精品久久久久久久久久久久久久久久久 | 91久久精| 夫妻午夜影院 | 欧美成视频| 午夜影视| 欧美一区二区三区在线观看 | 日一区二区 | 日韩成人在线播放 | 中午字幕在线观看 | 日韩精品视频中文字幕 | 中文字幕一区在线观看视频 | 亚洲综合色 | 美国av毛片 | 2018天天干天天操 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 国产精品亚洲第一 | 狠狠爱免费视频 | 成av人电影在线 | 欧美a区 |