在操作插件里处理跨库问题原创
金蝶云社区-steven4812
steven4812
12人赞赏了该文章 1209次浏览 未经作者许可,禁止转载编辑于2023年06月28日 22:08:58
苍穹操作插件里是一个事务,如果遇到跨库操作(比如业务操作是在财务库,记录的日志表是二开的,在扩展库),会报错:
一个事务内不能同时写入多个数据库

上传图片

此时需要新启一个事务处理,参考代码:
try (TXHandle h = TX.requiresNew()) {
    try {
        //跨库的操作代码
        SaveServiceHelper.save(new DynamicObject[] {invoice});
    } catch (Throwable e) {
        h.markRollback();
        throw e;
    }
}


invoice在代码块外面拼装好,跨库代码块只做数据库操作


背景知识:

spring的@Transactional中可以设置以下7种事务传播行为
  • REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

  • MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。

  • REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

  • NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。


而苍穹的传播类型参考枚举类Propagation

@SdkPublic
public enum Propagation {
    SUPPORTS,    
    REQUIRED,    
    REQUIRES_NEW,    
    NOT_SUPPORTED,    
    NESTED;    
    
    private Propagation() {
    }
}
和spring类似,通常我们只会用到REQUIRED,在特殊需求的时候需要在一个方法内部提前提交一部分事务或者是让内部的一段代码处于单独的一个事务管理的时候需要用到REQUIRES_NEW


赞 12