Skip to content

Commit e797bb0

Browse files
authored
Preserve auto commit state (#284)
Preserve an auto-commit state of a JDBC connection
1 parent 8e94217 commit e797bb0

File tree

5 files changed

+43
-14
lines changed

5 files changed

+43
-14
lines changed

src/main/java/org/seasar/doma/jdbc/tx/LocalTransaction.java

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ protected void beginInternal(
130130
context.begin(
131131
() -> {
132132
Connection connection = JdbcUtil.getConnection(dataSource);
133+
133134
int transactionIsolation;
134135
try {
135136
transactionIsolation = connection.getTransactionIsolation();
@@ -147,13 +148,24 @@ protected void beginInternal(
147148
throw new JdbcException(Message.DOMA2055, e, transactionIsolationLevel.name(), e);
148149
}
149150
}
151+
152+
boolean isAutoCommit;
150153
try {
151-
connection.setAutoCommit(false);
154+
isAutoCommit = connection.getAutoCommit();
152155
} catch (SQLException e) {
153156
closeConnection(connection);
154-
throw new JdbcException(Message.DOMA2041, e, e);
157+
throw new JdbcException(Message.DOMA2084, e, e);
158+
}
159+
if (isAutoCommit) {
160+
try {
161+
connection.setAutoCommit(false);
162+
} catch (SQLException e) {
163+
closeConnection(connection);
164+
throw new JdbcException(Message.DOMA2041, e, e);
165+
}
155166
}
156-
return new LocalTransactionConnection(connection, transactionIsolation);
167+
168+
return new LocalTransactionConnection(connection, transactionIsolation, isAutoCommit);
157169
});
158170
jdbcLogger.logTransactionBegun(className, callerMethodName, context.getId());
159171
}
@@ -408,8 +420,10 @@ protected void release(LocalTransactionContext context, String callerMethodName)
408420
if (!context.hasConnection()) {
409421
return;
410422
}
411-
LocalTransactionConnection connection = context.getConnection();
412-
int isolationLevel = connection.getPreservedTransactionIsolation();
423+
LocalTransactionConnection localTransactionConnection = context.getConnection();
424+
Connection connection = localTransactionConnection.getWrappedConnection();
425+
426+
int isolationLevel = localTransactionConnection.getPreservedTransactionIsolation();
413427
if (isolationLevel != Connection.TRANSACTION_NONE) {
414428
try {
415429
connection.setTransactionIsolation(isolationLevel);
@@ -418,12 +432,17 @@ protected void release(LocalTransactionContext context, String callerMethodName)
418432
className, callerMethodName, isolationLevel, ignored);
419433
}
420434
}
421-
try {
422-
connection.setAutoCommit(true);
423-
} catch (SQLException ignored) {
424-
jdbcLogger.logAutoCommitEnablingFailure(className, callerMethodName, ignored);
435+
436+
boolean isAutoCommit = localTransactionConnection.getPreservedAutoCommitState();
437+
if (isAutoCommit) {
438+
try {
439+
connection.setAutoCommit(true);
440+
} catch (SQLException ignored) {
441+
jdbcLogger.logAutoCommitEnablingFailure(className, callerMethodName, ignored);
442+
}
425443
}
426-
closeConnection(connection.getWrappedConnection());
444+
445+
closeConnection(connection);
427446
}
428447

429448
protected void closeConnection(Connection connection) {

src/main/java/org/seasar/doma/jdbc/tx/LocalTransactionConnection.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,32 @@ class LocalTransactionConnection implements Connection {
2121

2222
private final int preservedTransactionIsolation;
2323

24+
private final boolean preservedAutoCommitState;
25+
2426
/**
2527
* Creates an instance.
2628
*
2729
* @param connection the internal connection
2830
* @param preservedTransactionIsolation the transaction isolation to be preserved
31+
* @param preservedAutoCommitState the auto commit state to be preserved
2932
*/
30-
public LocalTransactionConnection(Connection connection, int preservedTransactionIsolation) {
33+
public LocalTransactionConnection(
34+
Connection connection, int preservedTransactionIsolation, boolean preservedAutoCommitState) {
3135
assertNotNull(connection);
3236
assertTrue(!(connection instanceof LocalTransactionConnection));
3337
this.connection = connection;
3438
this.preservedTransactionIsolation = preservedTransactionIsolation;
39+
this.preservedAutoCommitState = preservedAutoCommitState;
3540
}
3641

3742
protected int getPreservedTransactionIsolation() {
3843
return this.preservedTransactionIsolation;
3944
}
4045

46+
protected boolean getPreservedAutoCommitState() {
47+
return preservedAutoCommitState;
48+
}
49+
4150
/**
4251
* Returns the wrapped internal connection.
4352
*

src/main/java/org/seasar/doma/message/Message.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ public enum Message implements MessageResource {
101101
DOMA2081("Pessimistic locking with aliases and WAIT option is not supported in the DBMS[{0}]."),
102102
DOMA2082("Pessimistic locking with aliases and NOWAIT option is not supported in the DBMS[{0}]."),
103103
DOMA2083("Cannot reserve identity values for the entity[{0}]. The cause is as follows: {1}"),
104+
DOMA2084("Cannot get the auto commit state. The cause is as follows: {0}"),
104105
DOMA2101(
105106
"Failed to parse the SQL on line [{1}] at column [{2}]. The quotation mark \"''\" that indicates the end of a string literal is not found. SQL[{0}]"),
106107
DOMA2102(

src/test/java/org/seasar/doma/jdbc/tx/LocalTransactionConnectionTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class LocalTransactionConnectionTest extends TestCase {
1010
public void testIsWrapperFor() throws Exception {
1111
try (Connection connection =
1212
new LocalTransactionConnection(
13-
new MockConnection(), Connection.TRANSACTION_READ_COMMITTED)) {
13+
new MockConnection(), Connection.TRANSACTION_READ_COMMITTED, true)) {
1414
assertTrue(connection.isWrapperFor(LocalTransactionConnection.class));
1515
assertTrue(connection.isWrapperFor(MockConnection.class));
1616
assertFalse(connection.isWrapperFor(Runnable.class));
@@ -20,7 +20,7 @@ public void testIsWrapperFor() throws Exception {
2020
public void testUnwrap() throws Exception {
2121
try (Connection connection =
2222
new LocalTransactionConnection(
23-
new MockConnection(), Connection.TRANSACTION_READ_COMMITTED)) {
23+
new MockConnection(), Connection.TRANSACTION_READ_COMMITTED, true)) {
2424
assertNotNull(connection.unwrap(LocalTransactionConnection.class));
2525
assertNotNull(connection.unwrap(LocalTransactionConnection.class));
2626
try {

src/test/java/org/seasar/doma/jdbc/tx/LocalTransactionContextTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class LocalTransactionContextTest extends TestCase {
1111
public void testReleaseAndGetSavepoint() throws Exception {
1212
try (LocalTransactionConnection connection =
1313
new LocalTransactionConnection(
14-
new MockConnection(), Connection.TRANSACTION_READ_COMMITTED)) {
14+
new MockConnection(), Connection.TRANSACTION_READ_COMMITTED, true)) {
1515
LocalTransactionContext context = new LocalTransactionContext();
1616
context.addSavepoint("1", new MySavepoint("1"));
1717
context.addSavepoint("2", new MySavepoint("2"));

0 commit comments

Comments
 (0)