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 2d5553e396a Fix savepoint manager not cleaned up in distributed
transactions (#31872)
2d5553e396a is described below
commit 2d5553e396a6761a00f7f272d5c5c6582b0165ef
Author: ZhangCheng <[email protected]>
AuthorDate: Thu Jun 27 09:48:17 2024 +0800
Fix savepoint manager not cleaned up in distributed transactions (#31872)
* Fix savepoint manager not cleaned up in distributed transactions
* Fix savepoint manager not cleaned up in distributed transactions
---
.../jdbc/transaction/BackendTransactionManager.java | 12 ++++++++----
.../connector/jdbc/transaction/LocalTransactionManager.java | 5 -----
.../jdbc/transaction/BackendTransactionManagerTest.java | 13 +++++++++++++
3 files changed, 21 insertions(+), 9 deletions(-)
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
index c50b94b5a8c..73425a63dec 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
@@ -99,9 +99,11 @@ public final class BackendTransactionManager implements
TransactionManager {
each.afterCommit(connection.getCachedConnections().values(),
getTransactionContext(),
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext().getLockContext());
}
+ for (Connection each :
connection.getCachedConnections().values()) {
+
ConnectionSavepointManager.getInstance().transactionFinished(each);
+ }
connection.getConnectionSession().getTransactionStatus().setInTransaction(false);
-
connection.getConnectionSession().getConnectionContext().clearTransactionContext();
-
connection.getConnectionSession().getConnectionContext().clearCursorContext();
+
connection.getConnectionSession().getConnectionContext().close();
}
}
}
@@ -122,9 +124,11 @@ public final class BackendTransactionManager implements
TransactionManager {
for (TransactionHook each : transactionHooks) {
each.afterRollback(connection.getCachedConnections().values(),
getTransactionContext());
}
+ for (Connection each :
connection.getCachedConnections().values()) {
+
ConnectionSavepointManager.getInstance().transactionFinished(each);
+ }
connection.getConnectionSession().getTransactionStatus().setInTransaction(false);
-
connection.getConnectionSession().getConnectionContext().clearTransactionContext();
-
connection.getConnectionSession().getConnectionContext().clearCursorContext();
+
connection.getConnectionSession().getConnectionContext().close();
}
}
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/LocalTransactionManager.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/LocalTransactionManager.java
index 8be77ba57bb..da316abedb5 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/LocalTransactionManager.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/LocalTransactionManager.java
@@ -19,7 +19,6 @@ package
org.apache.shardingsphere.proxy.backend.connector.jdbc.transaction;
import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.proxy.backend.connector.ProxyDatabaseConnectionManager;
-import org.apache.shardingsphere.transaction.ConnectionSavepointManager;
import java.sql.Connection;
import java.sql.SQLException;
@@ -64,8 +63,6 @@ public final class LocalTransactionManager {
each.commit();
} catch (final SQLException ex) {
result.add(ex);
- } finally {
-
ConnectionSavepointManager.getInstance().transactionFinished(each);
}
}
return result;
@@ -90,8 +87,6 @@ public final class LocalTransactionManager {
each.rollback();
} catch (final SQLException ex) {
result.add(ex);
- } finally {
-
ConnectionSavepointManager.getInstance().transactionFinished(each);
}
}
return result;
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
index ad3eebfdab2..9c011012170 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManagerTest.java
@@ -17,6 +17,8 @@
package org.apache.shardingsphere.proxy.backend.connector.jdbc.transaction;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
import lombok.SneakyThrows;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
@@ -40,6 +42,7 @@ import org.mockito.internal.configuration.plugins.Plugins;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
+import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collections;
@@ -69,18 +72,28 @@ class BackendTransactionManagerTest {
@Mock
private ShardingSphereDistributionTransactionManager
distributionTransactionManager;
+ @Mock
+ private Connection connection;
+
private BackendTransactionManager backendTransactionManager;
@BeforeEach
void setUp() {
when(connectionSession.getTransactionStatus()).thenReturn(transactionStatus);
when(databaseConnectionManager.getConnectionSession()).thenReturn(connectionSession);
+
when(databaseConnectionManager.getCachedConnections()).thenReturn(mockCachedConnections());
ConnectionContext connectionContext = mock(ConnectionContext.class);
when(connectionSession.getConnectionContext()).thenReturn(connectionContext);
TransactionConnectionContext context = new
TransactionConnectionContext();
when(connectionContext.getTransactionContext()).thenReturn(context);
}
+ private Multimap<String, Connection> mockCachedConnections() {
+ Multimap<String, Connection> result = HashMultimap.create();
+ result.putAll("ds1", Collections.singleton(connection));
+ return result;
+ }
+
@Test
void assertBeginForLocalTransaction() {
ContextManager contextManager =
mockContextManager(TransactionType.LOCAL);