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

jOOQ 事务失效

  •  1
     
  •   wuhunyu 315 天前 1842 次点击
    这是一个创建于 315 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,我在使用 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; } } 

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

    7 条回复    2025-03-04 16:10:39 +08:00
    Gilgamesh7
        1
    Gilgamesh7  
       315 天前
    2 种框架调用方式不一样,jooq 事务注解是基于 AOP 的,同一个类会有自调用问题,事务不生效 ,mybatis 是动态代理机制调用的,可以生效,把这个逻辑拆成 2 个类,应该就可以了
    fms
        2
    fms  
       315 天前 via Android
    可以把 org.springframework.jdbc 的 debug 级别日志打开,好找问题
    wuhunyu
        3
    wuhunyu  
    OP
       315 天前
    @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
       315 天前
    @fms 好的,明天摸鱼的时候 debug 调试看看
    fantasy0v0
        5
    fantasy0v0  
       314 天前
    把你在 DataSourceConfig 中自己配置的删除掉就正常了。
    wuhunyu
        6
    wuhunyu  
    OP
       314 天前
    @fantasy0v0
    嗯,我之前没有使用 `spring-boot-starter-jooq` 启动器,而是单独引入的 `jooq` 依赖。直接删除那部分配置肯定是不行的。

    换成引入 `spring-boot-starter-jooq` 之后,把自己的配置删除确实可以了。

    不过我发现另一个问题是默认情况下使用 spring 的事务是正常的,但换用 jooq 自身的事务 api (比如 `dslContext.transaction`),就出现异常了。具体异常提示是 `Cannot use ContextTransactionalCallable with TransactionProvider of type class org.springframework.boot.autoconfigure.jooq.SpringTransactionProvider`。此时我还需要手动将 `org.jooq.TransactionProvider` 的实现从 `org.springframework.boot.autoconfigure.jooq.SpringTransactionProvider` 换成 `org.jooq.impl.ThreadLocalTransactionProvider` 才行
    MatthewHan
        7
    MatthewHan  
       273 天前
    在 MySQL 这类数据库的 autocommit 为 ON 的情况下,使用 TransactionAwareDataSourceProxy 可以避免让 DataSource 走自动提交的连接,避免事务失效。另外,dslContext#transaction 最好不要和 Spring 的事务一起写吧感觉。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2847 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 00:29 PVG 08:29 LAX 16:29 JFK 19:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86