线程内事务;应用内事务(跨线程、跨会话);跨应用事务;分布式事务

最后更新:2024-04-16 17:23:06 | 状态:未完成
  • 线程内事务
  • 应用内事务(跨线程、跨会话)
  • 跨应用事务
  • 分布式事务

默认的事务是基于线程变量实现的,参考【线程内事务说明

8.7.2及之后开始支持跨线程事务,在整个应用内有效。参考【跨线程事务
应用场景:
开启或提交事务 与 数据库不在同一线程内

如果依赖了anyline-environment-spring-data-jdbc需要启用DefaultEnvironmentWorker.start();覆盖spring事务管理器

    public static void master() throws Exception{
        //跨线程事务
        TransactionDefine define = new DefaultTransactionDefine();
        define.setName("tx1");//如果不设置会生成一个随机name
        define.setMode(TransactionDefine.MODE.APPLICATION);//设置有效范围
        TransactionState state = TransactionProxy.start(define);
        DataRow row = new DataRow();
        row.put("CODE", 1);
        ServiceProxy.insert("CRM_USER", row);
        String name = state.getName();
        //第二个线程或会话 使用同一个name启动事务
        slave(name);
    }
    public static void slave(String name) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    TransactionDefine define = new DefaultTransactionDefine();
                    define.setName(name);//使用同一个name启动事务 如果事务存在默认会加入上一个事务,不会新开启一个
                    define.setMode(TransactionDefine.MODE.APPLICATION);
                    TransactionState state = TransactionProxy.start(define);

                    DataRow row = new DataRow();
                    row.put("CODE", 2);
                    ServiceProxy.insert("CRM_USER", row);
                    //两个操作一块回滚
                    TransactionProxy.rollback(state);
                    //TransactionProxy.commit(state);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }


最近更新 搜索 提交