TX类,事务简单使用原创
金蝶云社区-吴锐雄
吴锐雄
15人赞赏了该文章 3,127次浏览 未经作者许可,禁止转载编辑于2022年08月03日 19:58:25


前言

最近用了一下TX类组成的事务,总结了一些心得,再写出一个我的案例,提供给各位开发者参考。


如果文章对你有帮助,请点赞收藏!


TX类的事务,对连续的几个操作无法生效

对数据库进行修改或者写入,这个时候事务是无法生效的。

例如,以下这种情况,没有办法使用TX类来实现一个事务。

源单下推并保存,提交目标单,审核目标单,这种连续操作,在TX类的事务上使用失败

try (TXHandle h = TX.required("wrxtest")) {
    try {
    ConvertOperationResult pushResult = ConvertServiceHelper.pushAndSave(pushArgs);
    OperationResult submitResult = OperationServiceHelper.executeOperate("submit","kdec_wrx_target", new DynamicObject[] { targetDObject }, OperateOption.create());
    OperationResult auditResult = OperationServiceHelper.executeOperate("audit","kdec_wrx_target", new DynamicObject[] { targetDObject }, OperateOption.create());
    } catch (Exception e) {
        System.out.println("transaction: "+"捕获异常,开始回滚");
        h.markRollback();
        //throw e;
    }
}


这种连续调用操作,没法简单的用一个事务包起来实现事务一致性。

如果操作内,涉及到 跨库插入、修改,也不支持回滚。


替代方案是用业务流或事件中心,依次调用操作。


TX类的事务,对直接执行sql能够生效

如下代码,如果使用TX对同一个库,执行几个update,那么回滚能够生效。

DBRoute dbRoute = DBRoute.of("secd");
{
    // 开启事务之前,把值设置为1
    Object[] params = {1};
    String sql = "update tk_kdec_textile_bill set fbillno = ? where fid = 1274505584929943552";
    DB.execute(dbRoute, sql, params);
}
// 如果事务不会滚,那么值就是5
// 如果事务回滚成功,那么值还是1
// 如果事务回滚失败,即没有产生回滚,那么值就是3
try (TXHandle h = TX.required("fi_voucher_submit")) {
    try {
        {
            Object[] params = {3};
            String sql = "update tk_kdec_textile_bill set fbillno = ? where fid = 1274505584929943552";
            DB.execute(dbRoute, sql, params);
        }

        if (true) {
            throw new KDException("transaction: " + "尝试回滚");
        }

        {
            Object[] params = {5};
            String sql = "update tk_kdec_textile_bill set fbillno = ? where fid = 1274505584929943552";
            DB.execute(dbRoute, sql, params);
        }
    } catch (Exception e) {
        System.out.println("transaction: " + "捕获异常,开始回滚");
        h.markRollback();
    }
}



参考文章

数据库事务(TX)

https://vip.kingdee.com/link/s/M5WXz


图标赞 15
15人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!