线程内事务;应用内事务(跨线程、跨会话);跨应用事务;分布式事务
最后更新: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(); }