This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 3c518554f90 Add nested transaction test case (#32718)
3c518554f90 is described below

commit 3c518554f9026cb9ac1a2df6705244fa7edf5ae7
Author: ZhangCheng <[email protected]>
AuthorDate: Thu Aug 29 11:38:53 2024 +0800

    Add nested transaction test case (#32718)
    
    * Add nested transaction test case
    
    * 11111
---
 .../cases/nested/NestedTransactionTestCase.java    | 88 +++++++++++++++++++++-
 1 file changed, 85 insertions(+), 3 deletions(-)

diff --git 
a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/nested/NestedTransactionTestCase.java
 
b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/nested/NestedTransactionTestCase.java
index da3d0f16d70..c89cf9ce5dd 100644
--- 
a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/nested/NestedTransactionTestCase.java
+++ 
b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/nested/NestedTransactionTestCase.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTes
 import 
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
 import org.apache.shardingsphere.transaction.api.TransactionType;
 
+import java.sql.Connection;
 import java.sql.SQLException;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -41,20 +42,101 @@ public final class NestedTransactionTestCase extends 
BaseTransactionTestCase {
     
     @Override
     protected void executeTest(final TransactionContainerComposer 
containerComposer) throws SQLException {
-        try (ShardingSphereConnection connection = (ShardingSphereConnection) 
getDataSource().getConnection()) {
+        assertOuterCommitAndInnerRollback();
+        assertOuterRollbackAndInnerRollback();
+        assertOuterCommitAndInnerCommit();
+        assertOuterRollbackAndInnerCommit();
+    }
+    
+    private void assertOuterCommitAndInnerRollback() throws SQLException {
+        try (
+                ShardingSphereConnection connection = 
(ShardingSphereConnection) getDataSource().getConnection();
+                Connection queryConnection = getDataSource().getConnection()) {
+            
assertFalse(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            connection.setAutoCommit(false);
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (1, 1, 1), (2, 2, 2)");
+            
assertTrue(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            requiresNewTransactionRollback();
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (7, 7, 7), (8, 8, 8)");
+            
assertTrue(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            connection.commit();
+            assertAccountBalances(queryConnection, 1, 2, 3, 4, 7, 8);
+            connection.setAutoCommit(true);
+            executeWithLog(connection, "DELETE FROM ACCOUNT");
+        }
+    }
+    
+    private void assertOuterRollbackAndInnerRollback() throws SQLException {
+        try (
+                ShardingSphereConnection connection = 
(ShardingSphereConnection) getDataSource().getConnection();
+                Connection queryConnection = getDataSource().getConnection()) {
+            
assertFalse(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            connection.setAutoCommit(false);
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (1, 1, 1), (2, 2, 2)");
+            
assertTrue(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            requiresNewTransactionRollback();
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (7, 7, 7), (8, 8, 8)");
+            
assertTrue(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            connection.rollback();
+            assertAccountBalances(queryConnection, 3, 4);
+            connection.setAutoCommit(true);
+            executeWithLog(connection, "DELETE FROM ACCOUNT");
+        }
+    }
+    
+    private void assertOuterCommitAndInnerCommit() throws SQLException {
+        try (
+                ShardingSphereConnection connection = 
(ShardingSphereConnection) getDataSource().getConnection();
+                Connection queryConnection = getDataSource().getConnection()) {
             
assertFalse(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
             connection.setAutoCommit(false);
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (1, 1, 1), (2, 2, 2)");
             
assertTrue(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
-            requiresNewTransaction();
+            requiresNewTransactionCommit();
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (7, 7, 7), (8, 8, 8)");
             
assertTrue(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
             connection.commit();
+            assertAccountBalances(queryConnection, 1, 2, 3, 4, 5, 6, 7, 8);
+            connection.setAutoCommit(true);
+            executeWithLog(connection, "DELETE FROM ACCOUNT");
+        }
+    }
+    
+    private void assertOuterRollbackAndInnerCommit() throws SQLException {
+        try (
+                ShardingSphereConnection connection = 
(ShardingSphereConnection) getDataSource().getConnection();
+                Connection queryConnection = getDataSource().getConnection()) {
+            
assertFalse(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            connection.setAutoCommit(false);
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (1, 1, 1), (2, 2, 2)");
+            
assertTrue(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            requiresNewTransactionCommit();
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (7, 7, 7), (8, 8, 8)");
+            
assertTrue(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            connection.rollback();
+            assertAccountBalances(queryConnection, 3, 4, 5, 6);
+            connection.setAutoCommit(true);
+            executeWithLog(connection, "DELETE FROM ACCOUNT");
+        }
+    }
+    
+    private void requiresNewTransactionRollback() throws SQLException {
+        try (ShardingSphereConnection connection = (ShardingSphereConnection) 
getDataSource().getConnection()) {
+            
assertFalse(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (3, 3, 3), (4, 4, 4)");
+            connection.setAutoCommit(false);
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (5, 5, 5), (6, 6, 6)");
+            
assertTrue(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            connection.rollback();
         }
     }
     
-    private void requiresNewTransaction() throws SQLException {
+    private void requiresNewTransactionCommit() throws SQLException {
         try (ShardingSphereConnection connection = (ShardingSphereConnection) 
getDataSource().getConnection()) {
             
assertFalse(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (3, 3, 3), (4, 4, 4)");
             connection.setAutoCommit(false);
+            executeWithLog(connection, "INSERT INTO account (id, balance, 
transaction_id) VALUES (5, 5, 5), (6, 6, 6)");
             
assertTrue(connection.getDatabaseConnectionManager().getConnectionTransaction().isHoldTransaction(connection.getAutoCommit()));
             connection.commit();
         }

Reply via email to