/*2个数据库的事务,后面的根据前面的执行结果再决定要不要跟进(在同一个函数内,分布式)*/ public static void test_db2_tran2() { DbContext db = DbConfig.pc_user; DbContext db2 = DbConfig.pc_base; //1.建立主事务,并执于 DbTranQueue queue = new DbTranQueue(); //1.建立主事务,并执于 db.tran().join(queue).execute((t) => { db.sql("insert into test(txt) values(?)", "cc").tran(t).execute(); db.sql("insert into test(txt) values(?)", "dd").tran(t).execute(); db.sql("insert into test(txt) values(?)", "ee").tran(t).execute(); queue.result = 1; }); //2.根据执行结果判断 if ((int) queue.result == 1) { //3.执行第二个事务 db2.tran().join(queue).execute((t)=> { db2.sql("insert into test(txt) values(?)", "gg").tran(t).execute(); });//json(tran) 时,会自动调用 await(true); 当 await(true)时,需要之后的事务来触发或手动触发 } //4.统一触发事务 queue.complete(); }
/*加盟(到某一个事务当中)*/ public DbTran join(DbTranQueue queue) { if (queue != null) { this.queue = queue; queue.add(this); } return this; }
private static void tast_db2_tran(DbTranQueue queue) { //使用了 .await(true) 将不提交事务(交由上一层控制) // DbTran tran = DbConfig.pc_base.tran(); tran.join(queue).execute((t) => { t.db().sql("insert into $.test(txt) values(?)", "gg").tran(t).execute(); }); }
/*加盟(到某一个事务当中)*/ public DbTran join(DbTranQueue queue) { if (queue != null) { this.queue = queue; queue.add(this); } return(this); }
private static void tast_db3_tran(DbTranQueue queue) { //使用了 .await(true) 将不提交事务(交由上一层控制) // DbTran tran = new DbTran(DbConfig.pc_live); tran.join(queue).execute((t) => { t.db().sql("insert into $.test(txt) values(?)", "xx").tran(t).execute(); throw new Exception("xxxx"); }); }
//------------------ private static void tast_db1_tran(DbTranQueue queue) { //使用了 .await(true) 将不提交事务(交由上一层控制) // DbTran tran = new DbTran(DbConfig.pc_user); tran.join(queue).execute((t) => { t.db().sql("insert into $.test(txt) values(?)", "cc").tran(t).execute(); t.db().sql("insert into $.test(txt) values(?)", "dd").tran(t).execute(); t.db().sql("insert into $.test(txt) values(?)", "ee").tran(t).execute(); t.result = t.db().sql("select name from $.user_info where user_id=3").tran(t).getValue(""); }); }
//不同函数串一起,跨多个数据库(分布式) public static void tast_tran() { DbTranQueue queue = new DbTranQueue();//空事务,只提供最后的complete服务; try { //以下操作在同一个事务队列里执行(各事务独立) tast_db1_tran(queue); tast_db2_tran(queue); tast_db3_tran(queue); } finally { //确保事务有完成的执行 queue.complete(); } }
/*2个数据库的事务(在同一个函数内,分布式)*/ public static void test_db2_tran() { DbContext db = DbConfig.pc_user; DbContext db2 = DbConfig.pc_base; //1.建立主事务,并执于 DbTranQueue queue = new DbTranQueue(); db.tran().join(queue).execute((t) => { db.sql("insert into test(txt) values(?)", "cc").tran(t).execute(); db.sql("insert into test(txt) values(?)", "dd").tran(t).execute(); db.sql("insert into test(txt) values(?)", "ee").tran(t).execute(); }); //2.执行第二个事务 db2.tran().join(queue).execute((t) => { db2.sql("insert into test(txt) values(?)", "gg").tran(t).execute(); }); queue.complete(); }