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
    评论
"Failed to obtain JDBC Connection; nested exception is com.atomikos.jdbc.AtomikosSQLException: Connection pool exhausted" 是一个常见的错误信息,它通常表示数据库连接池无法提供足够的连接给应用程序使用。 这个错误可能有以下几个原因: 1. 数据库连接池配置不正确:检查数据库连接池的最大连接数配置是否足够满足应用程序的需求。如果连接数设置过低,可能会导致连接池耗尽。 2. 数据库连接泄漏:应用程序在使用完数据库连接后没有正确地释放连接,导致连接池中的连接无法被重用,最终耗尽连接池资源。 3. 数据库连接超时:如果数据库连接在一段时间内没有被使用,连接池可能会将其关闭,释放资源。当应用程序再次请求连接时,可能会出现连接池耗尽的情况。 4. 数据库服务器负载过高:如果数据库服务器负载过高,无法及时处理应用程序的连接请求,可能会导致连接池无法获取到足够的连接。 为了解决这个问题,你可以尝试以下几个步骤: 1. 检查数据库连接池的配置,确保最大连接数足够满足应用程序的需求。 2. 检查应用程序中是否存在数据库连接泄漏的情况,确保在使用完数据库连接后及时释放连接。 3. 调整数据库连接超时时间,确保连接池中的连接能够被重用。 4. 检查数据库服务器的负载情况,如果负载过高,考虑优化数据库服务器的性能或者增加服务器资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小海海不怕困难

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

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

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

打赏作者

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

抵扣说明:

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

余额充值