diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/datasource/FlexDataSource.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/datasource/FlexDataSource.java index bec05aaa..b36879b7 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/datasource/FlexDataSource.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/datasource/FlexDataSource.java @@ -28,7 +28,6 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.SQLException; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -154,7 +153,6 @@ public class FlexDataSource extends AbstractDataSource { //do nothing return null; } - System.out.println(">>>>>>invoke: " + method.getName() + " args: " + Arrays.toString(args)); return method.invoke(original, args); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Db.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Db.java index 6235cba0..42466663 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Db.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/row/Db.java @@ -26,7 +26,6 @@ import org.apache.ibatis.util.MapUtil; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; @@ -395,34 +394,29 @@ public class Db { public static boolean tx(Supplier supplier) { //上一级事务的id,支持事务嵌套 - String prevXID = TransactionContext.getXID(); + String higherXID = TransactionContext.getXID(); try { - String xid = UUID.randomUUID().toString(); - TransactionContext.hold(xid); + String xid = TransactionalManager.startTransactional(); Boolean success = false; boolean rollbacked = false; try { success = supplier.get(); } catch (Exception e) { rollbacked = true; - TransactionContext.release(); TransactionalManager.rollback(xid); e.printStackTrace(); } finally { if (success != null && success) { - //必须优先 release 掉 xid,才能正常 commit() - TransactionContext.release(); TransactionalManager.commit(xid); } else if (!rollbacked) { - TransactionContext.release(); TransactionalManager.rollback(xid); } } return success != null && success; } finally { //恢复上一级事务 - if (prevXID != null) { - TransactionContext.hold(prevXID); + if (higherXID != null) { + TransactionContext.hold(higherXID); } } } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/transaction/TransactionContext.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/transaction/TransactionContext.java index 80692e14..5d1f6d5a 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/transaction/TransactionContext.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/transaction/TransactionContext.java @@ -32,5 +32,4 @@ public class TransactionContext { XID_HOLDER.set(xid); } - } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/transaction/TransactionalManager.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/transaction/TransactionalManager.java index 29857cf2..b123eab0 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/transaction/TransactionalManager.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/transaction/TransactionalManager.java @@ -21,6 +21,7 @@ import org.apache.ibatis.logging.LogFactory; import java.sql.Connection; import java.sql.SQLException; import java.util.Map; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; /** @@ -34,6 +35,7 @@ public class TransactionalManager { private static final ThreadLocal>> CONNECTION_HOLDER = ThreadLocal.withInitial(ConcurrentHashMap::new); + public static void hold(String xid, String ds, Connection connection) { Map> holdMap = CONNECTION_HOLDER.get(); Map connMap = holdMap.get(xid); @@ -63,6 +65,12 @@ public class TransactionalManager { } + public static String startTransactional() { + String xid = UUID.randomUUID().toString(); + TransactionContext.hold(xid); + return xid; + } + public static void commit(String xid) { release(xid, true); } @@ -71,8 +79,10 @@ public class TransactionalManager { release(xid, false); } - private static void release(String xid, boolean commit) { + //先release,才能正常的进行 commit 或者 rollback. + TransactionContext.release(); + Exception exception = null; Map> holdMap = CONNECTION_HOLDER.get(); try {