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

Reply via email to