91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

如何解決Java注解@Transactional事務類內調用不生效問題

發布時間:2020-07-22 15:04:54 來源:億速云 閱讀:730 作者:小豬 欄目:編程語言

這篇文章主要講解了如何解決Java注解@Transactional事務類內調用不生效問題,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

@Transactional 內部調用例子

在 Spring 的 AOP 代理下,只有目標方法由外部調用,目標方法才由 Spring 生成的代理對象來管理,這會造成自調用問題。
若同一類中的其他沒有@Transactional 注解的方法內部調用有@Transactional 注解的方法,有@Transactional 注解的方法的事務被忽略,不會發生回滾

@Service
public class A{
  
  public void action(){
    dosome();
  }
  
  @Transactional
  public void dosome(){
    doa.insert(new Object());
  }
}

如上代碼,在方法dosome()中拋出異常時,數據操作不會回滾

解決方案

思路: 強制使用 AspectJ 對方法進行切面

Springboot 引入 AspectJ 切面

pom.xml 中添加AspectJ:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.9.5</version>
</dependency>

啟動類中添加 @EnableAspectJAutoProxy(exposeProxy = true)

@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy = true)
public class DonngPartsApplication {

  public static void main(String[] args) {
    SpringApplication.run(DonngPartsApplication.class, args);
  }

}

注意: exposeProxy = true 若不添加,則會報:

java.lang.IllegalStateException:

Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available,

and ensure that AopContext.currentProxy() is invoked in the same thread as the AOP invocation context.

代碼中 ((A) AopContext.currentProxy()).dosome()

修改為如下代碼,事務就生效啦

@Service
public class A{
  
  public void action(){
    ((A) AopContext.currentProxy()).dosome();
  }
  
  @Transactional
  public void dosome(){
    doa.insert(new Object());
  }
}

@Transactional 進階

1. @Transactional 注解的屬性信息

屬性描述
name當在配置文件中有多個 TransactionManager , 可以用該屬性指定選擇哪個事務管理器
propagation事務的傳播行為,默認值為 REQUIRED
isolation事務的隔離度,默認值采用 DEFAULT
timeout事務的超時時間,默認值為-1。如果超過該時間限制但事務還沒有完成,則自動回滾事務
read-only指定事務是否為只讀事務,默認值為 false;為了忽略那些不需要事務的方法,比如讀取數據,可以設置 read-only 為 true
rollback-for用于指定能夠觸發事務回滾的異常類型,如果有多個異常類型需要指定,各類型之間可以通過逗號分隔
no-rollback- for拋出 no-rollback-for 指定的異常類型,不回滾事務

2. propagation 傳播行為

  • REQUIRED:如果有事務, 那么加入事務, 沒有的話新建一個(默認情況下)
  • NOT_SUPPORTED:容器不為這個方法開啟事務
  • REQUIRES_NEW:不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
  • MANDATORY:必須在一個已有的事務中執行,否則拋出異常
  • NEVER:必須在一個沒有的事務中執行,否則拋出異常(與MANDATORY相反)
  • SUPPORTS:如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務.
  • NESTED: 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。

3. 事物超時設置
@Transactional(timeout=30) //默認是30秒

4. 事務隔離級別 isolation

  • READ_UNCOMMITTED:讀取未提交數據(會出現臟讀, 不可重復讀) 基本不使用
  • READ_COMMITTED:讀取已提交數據(會出現不可重復讀和幻讀)
  • REPEATABLE_READ:可重復讀(會出現幻讀)
  • SERIALIZABLE:串行化

注意

@Transactional 只能被應用到public方法上

僅僅@Transactional 注解的出現不足于開啟事務行為,它僅僅是一種元數據

看完上述內容,是不是對如何解決Java注解@Transactional事務類內調用不生效問題有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

澄城县| 雷山县| 山西省| 利津县| 柘城县| 新昌县| 西贡区| 云霄县| 甘肃省| 平果县| 玉龙| 辽阳市| 伊川县| 桐梓县| 陕西省| 繁峙县| 九台市| 安国市| 罗城| 墨脱县| 托里县| 太保市| 延川县| 宜宾县| 都昌县| 安丘市| 盱眙县| 清原| 凭祥市| 公主岭市| 临潭县| 安溪县| 南和县| 谷城县| 长岭县| 太保市| 新巴尔虎右旗| 长顺县| 敖汉旗| 洞头县| 田东县|