diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index 52045044cd..76b1b17d51 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -583,7 +583,7 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } finally { - handleEndTransaction(); + handleEndTransaction(dataSource); } } @@ -593,11 +593,11 @@ public class PoolableConnection implements PooledConnection, Connection { @Override public void rollback() throws SQLException { + checkOpen(); + if (transactionInfo == null) { return; } - - checkOpen(); DruidAbstractDataSource dataSource = holder.getDataSource(); dataSource.incrementRollbackCount(); @@ -607,7 +607,7 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } finally { - handleEndTransaction(); + handleEndTransaction(dataSource); } } @@ -630,14 +630,12 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } finally { - handleEndTransaction(); + handleEndTransaction(dataSource); } } - private void handleEndTransaction() { + private void handleEndTransaction(DruidAbstractDataSource dataSource) { if (transactionInfo != null) { - DruidAbstractDataSource dataSource = holder.getDataSource(); - long currentTimeMillis = System.currentTimeMillis(); transactionInfo.setEndTimeMillis(currentTimeMillis); diff --git a/src/main/java/com/alibaba/druid/pool/PoolableStatement.java b/src/main/java/com/alibaba/druid/pool/PoolableStatement.java index c8a0baef55..30eed98a9d 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableStatement.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableStatement.java @@ -249,6 +249,8 @@ public class PoolableStatement extends PoolableWrapper implements Statement { @Override public final boolean execute(String sql) throws SQLException { checkOpen(); + + transactionRecord(sql); try { return stmt.execute(sql); diff --git a/src/test/java/com/alibaba/druid/bvt/pool/basic/ConnectionTest4.java b/src/test/java/com/alibaba/druid/bvt/pool/basic/ConnectionTest4.java index a987a8b845..4b3f28a227 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/basic/ConnectionTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/basic/ConnectionTest4.java @@ -5,6 +5,7 @@ import java.sql.Date; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import junit.framework.Assert; import junit.framework.TestCase; @@ -497,6 +498,10 @@ public class ConnectionTest4 extends TestCase { public void test_rollback() throws Exception { PoolableConnection conn = dataSource.getConnection().unwrap(PoolableConnection.class); + conn.setAutoCommit(false); + Statement stmt = conn.createStatement(); + stmt.execute("SELECT 1"); + conn.getConnection().close(); { SQLException error = null;