V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wuhunyu
V2EX  ›  程序员

jOOQ 事务失效

  •  
  •   wuhunyu · 16 小时 6 分钟前 · 477 次点击

    如题,我在使用 jOOQ 的时候,事务无法正常生效,无论是声明式事务还是编程式事务

    当我以为是代码问题时,我换回了 mybatis ,发现事务是正常的

    使用编程式事务时,大致代码如下

    @Service("userService4Jooq")
    @RequiredArgsConstructor
    @Slf4j
    public class UserService4Jooq {
    
        private final TUserDao userDao;
    
        @Transactional(rollbackFor = Exception.class)
        public Integer insert(final Long userId, final String userName) {
            final TUserRecord tUserRecord = new TUserRecord();
            tUserRecord.setId(userId);
            tUserRecord.setUserName(userName);
            final TUser tUser = tUserRecord.into(TUser.class);
            userDao.insert(tUser);
            return 1;
        }
    
        @Transactional(readOnly = true)
        public TUser selectById(final Long userId) {
            return userDao.fetchOneById(userId);
        }
    
        @Transactional(rollbackFor = Exception.class)
        public TUser insertRetuning(final Long userId, final String userName) {
            this.insert(userId, userName);
            return this.selectById(userId);
        }
    
        @Transactional(rollbackFor = Exception.class)
        public TUser insertRetuningThrow(final Long userId, final String userName) {
            final TUser tUser = this.insertRetuning(userId, userName);
            // TODO: 手动异常,待删除
            int i = 10 / 0;
            return tUser;
        }
    
    }
    

    完整的样例代码可以访问这里

    4 条回复    2025-01-21 18:52:42 +08:00
    Gilgamesh7
        1
    Gilgamesh7  
       15 小时 51 分钟前
    2 种框架调用方式不一样,jooq 事务注解是基于 AOP 的,同一个类会有自调用问题,事务不生效 ,mybatis 是动态代理机制调用的,可以生效,把这个逻辑拆成 2 个类,应该就可以了
    fms
        2
    fms  
       15 小时 36 分钟前 via Android
    可以把 org.springframework.jdbc 的 debug 级别日志打开,好找问题
    wuhunyu
        3
    wuhunyu  
    OP
       15 小时 20 分钟前
    @Gilgamesh7 不管是 jooq 还是 mybatis ,示例中都是使用 spring 的 @Transactional 注解来声明事务的。我的代码写的有一些歧义,但事务应该都要能正常生效才对。自调用是可能导致事务失效,但自调用的方法自身是已经开启了事务的,那么事务就应该继续生效才对。现在我换用了 jooq 的事务方法使用编程式事务,测试代码如下
    ```java
    @Test
    @DisplayName("jooq 编程式事务")
    @Order(5)
    public void testJooqExceptionByProgrammatic() {
    TUser tUser = null;
    try {
    // 开启事务
    tUser = dslContext.transactionResult(() -> {
    return userService4Jooq.insertRetuningThrow(userId4Jooq, userName4Jooq);
    });
    } catch (Exception e) {
    // 不需要关注此异常
    }

    Assertions.assertNull(tUser, "事务回滚失败");
    }
    ```
    事务可以正常运行,插入的结果正常回滚了

    但声明式事务还不清楚是什么原因失效了
    wuhunyu
        4
    wuhunyu  
    OP
       15 小时 17 分钟前
    @fms 好的,明天摸鱼的时候 debug 调试看看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5809 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 02:10 · PVG 10:10 · LAX 18:10 · JFK 21:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.