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();
}