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人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读