真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何解決SpringBoot內(nèi)部調(diào)用事務(wù)不起作用的問(wèn)題

這篇文章給大家分享的是有關(guān)如何解決SpringBoot內(nèi)部調(diào)用事務(wù)不起作用的問(wèn)題的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

10年積累的網(wǎng)站制作、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有華安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

場(chǎng)景

我在這里模擬一個(gè)場(chǎng)景,大概的調(diào)用方式就如下面的代碼這樣。

  @Override
  @Transactional(rollbackFor = RuntimeException.class)
  public void insertUser(User user) {
    userMapper.insertUser(user);
    throw new RuntimeException("");
  }
  
  /**
   * 內(nèi)部調(diào)用新增方法
   *
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    this.insertUser(user);
  }

原因

AOP使用的是動(dòng)態(tài)代理的機(jī)制,它會(huì)給類(lèi)生成一個(gè)代理類(lèi),事務(wù)的相關(guān)操作都在代理類(lèi)上完成。內(nèi)部方式使用this調(diào)用方式時(shí),使用的是實(shí)例調(diào)用,并沒(méi)有通過(guò)代理類(lèi)調(diào)用方法,所以會(huì)導(dǎo)致事務(wù)失效。

解決辦法

方法一 引入自身bean

在類(lèi)內(nèi)部通過(guò)@Autowired將本身bean引入,然后通過(guò)調(diào)用自身bean,從而實(shí)現(xiàn)使用AOP代理操作。

注入自身bean

  @Autowired
  @Lazy
  private UserService service;

修改invokeInsertUser方法

  /**
   * 解決方法一 在bean中將自己注入進(jìn)來(lái)
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    this.service.insertUser(user);
  }

方法二 通過(guò)ApplicationContext引入bean

通過(guò)ApplicationContext獲取bean,通過(guò)bean調(diào)用內(nèi)部方法,就使用了bean的代理類(lèi)。

注入ApplicationContext

  @Autowired
  ApplicationContext applicationContext;

修改invokeInsertUser方法

  /**
   * 解決方法二 通過(guò)applicationContext獲取到bean
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    ((UserService)applicationContext.getBean("userService")).invokeInsertUser(user);
  }

方法三 通過(guò)AopContext獲取當(dāng)前類(lèi)的代理類(lèi)

通過(guò)AopContext獲取當(dāng)前類(lèi)的代理類(lèi),直接通過(guò)代理類(lèi)調(diào)用方法

在引導(dǎo)類(lèi)上添加@EnableAspectJAutoProxy(exposeProxy=true)注解

修改invokeInsertUser方法

  /**
   * 解決方法三 通過(guò)applicationContext獲取到bean
   *
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    ((UserService) AopContext.currentProxy()).invokeInsertUser(user);
  }

感謝各位的閱讀!關(guān)于“如何解決SpringBoot內(nèi)部調(diào)用事務(wù)不起作用的問(wèn)題”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!


文章標(biāo)題:如何解決SpringBoot內(nèi)部調(diào)用事務(wù)不起作用的問(wèn)題
網(wǎng)址分享:http://weahome.cn/article/gdogds.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部