Atomikos常见问题

一、事务不生效

情况一:抛出非运行时异常

业务代码:

    @Override
    @Transactional
    public void crossDatabaseTransactional(String name) throws DivideByZeroException {
        List<User> users = new LinkedList<>();
        User user = new User();
        user.setName("qqqqq");
        users.add(user);


        Integer r2 = secondUserMapper.insertUsers(users);
        Integer r3 = thirdUserMapper.insertUsers(users);
        if(2==2){
            throw new DivideByZeroException();
        }


    }

测试代码:

    @Test
    void testCrossDatabaseTransactional() throws DivideByZeroException {

        userService.crossDatabaseTransactional("王源");

    }

错误详情:

运行代码后事务不生效,即使发生了错误也无法回滚,数据仍然插入成功。

解决方法:

方法一:

将异常类继承RuntimeException,异常类代码修改如下:

public class DivideByZeroException extends RuntimeException {
}

此时事务生效,都没有插入成功

方法二:

不抛出异常,用@SneakyThrows注解处理异常,业务代码修改如下:

   @SneakyThrows
    @Override
    @Transactional
    public void crossDatabaseTransactional(String name) {
        List<User> users = new LinkedList<>();
        User user = new User();
        user.setName("qqqqq");
        users.add(user);


        Integer r2 = secondUserMapper.insertUsers(users);
      
        Integer r3 = thirdUserMapper.insertUsers(users);

        if(2==2){
            throw new DivideByZeroException();
        }

    }

二、无法插入数据

情况一:调用方使用@Transactional注解

业务代码:

    @SneakyThrows
    @Override
    @Transactional
    public void crossDatabaseTransactional(String name) {
        List<User> users = new LinkedList<>();
        User user = new User();
        user.setName("qqqqq");
        users.add(user);


        Integer r2 = secondUserMapper.insertUsers(users);

        Integer r3 = thirdUserMapper.insertUsers(users);



    }

测试代码:

  @Test
    @Transactional
    void testCrossDatabaseTransactional()  {
        userService.crossDatabaseTransactional("王源");

    }

错误详情:

运行插入语句后数据库没有对应数据。

 

错误原因:

调用方使用@Transactional注解

解决方法:

方法一:

调用方删去@Transactional注解,代码如下:

  @Test
  
    void testCrossDatabaseTransactional()  {
        userService.crossDatabaseTransactional("王源");

    }

方法二:

修改调用方事务传播级别为SUPPORTS,代码如下:

  @Test
    @Transactional(propagation = Propagation.SUPPORTS)
    void testCrossDatabaseTransactional()  {

        userService.crossDatabaseTransactional("王源");


    }

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海海不怕困难

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值