Skip to content

Commit 3d352dd

Browse files
authored
Reduced unnecessary calls to Connection#setTransactionIsolation(level) in LocalTransaction (#1121)
* Reduced unnecessary calls to Connection#setTransactionIsolation(level) in LocalTransaction. * Represent the absence of an isolation level to preserve with null * Remove redundant suppression
1 parent 89edd51 commit 3d352dd

File tree

4 files changed

+26
-19
lines changed

4 files changed

+26
-19
lines changed

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

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -133,21 +133,25 @@ protected void beginInternal(
133133
() -> {
134134
Connection connection = JdbcUtil.getConnection(dataSource);
135135

136-
int transactionIsolation;
137-
try {
138-
transactionIsolation = connection.getTransactionIsolation();
139-
} catch (SQLException e) {
140-
closeConnection(connection);
141-
throw new JdbcException(Message.DOMA2056, e, e);
142-
}
136+
@SuppressWarnings("ReassignedVariable")
137+
Integer currentTransactionIsolation = null;
143138
if (transactionIsolationLevel != null
144139
&& transactionIsolationLevel != TransactionIsolationLevel.DEFAULT) {
145-
int level = transactionIsolationLevel.getLevel();
146140
try {
147-
connection.setTransactionIsolation(level);
141+
currentTransactionIsolation = connection.getTransactionIsolation();
148142
} catch (SQLException e) {
149143
closeConnection(connection);
150-
throw new JdbcException(Message.DOMA2055, e, transactionIsolationLevel.name(), e);
144+
throw new JdbcException(Message.DOMA2056, e, e);
145+
}
146+
int level = transactionIsolationLevel.getLevel();
147+
if (currentTransactionIsolation != level) {
148+
try {
149+
//noinspection MagicConstant
150+
connection.setTransactionIsolation(level);
151+
} catch (SQLException e) {
152+
closeConnection(connection);
153+
throw new JdbcException(Message.DOMA2055, e, transactionIsolationLevel.name(), e);
154+
}
151155
}
152156
}
153157

@@ -167,7 +171,8 @@ protected void beginInternal(
167171
}
168172
}
169173

170-
return new LocalTransactionConnection(connection, transactionIsolation, isAutoCommit);
174+
return new LocalTransactionConnection(
175+
connection, currentTransactionIsolation, isAutoCommit);
171176
});
172177
jdbcLogger.logTransactionBegun(className, callerMethodName, context.getId());
173178
}
@@ -422,9 +427,10 @@ protected void release(LocalTransactionContext context, String callerMethodName)
422427
LocalTransactionConnection localTransactionConnection = context.getConnection();
423428
Connection connection = localTransactionConnection.getWrappedConnection();
424429

425-
int isolationLevel = localTransactionConnection.getPreservedTransactionIsolation();
426-
if (isolationLevel != Connection.TRANSACTION_NONE) {
430+
Integer isolationLevel = localTransactionConnection.getPreservedTransactionIsolation();
431+
if (isolationLevel != null && isolationLevel != Connection.TRANSACTION_NONE) {
427432
try {
433+
//noinspection MagicConstant
428434
connection.setTransactionIsolation(isolationLevel);
429435
} catch (SQLException e) {
430436
jdbcLogger.logTransactionIsolationSettingFailure(

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class LocalTransactionConnection implements Connection {
1919

2020
private final Connection connection;
2121

22-
private final int preservedTransactionIsolation;
22+
private final Integer preservedTransactionIsolation;
2323

2424
private final boolean preservedAutoCommitState;
2525

@@ -31,15 +31,17 @@ class LocalTransactionConnection implements Connection {
3131
* @param preservedAutoCommitState the auto commit state to be preserved
3232
*/
3333
public LocalTransactionConnection(
34-
Connection connection, int preservedTransactionIsolation, boolean preservedAutoCommitState) {
34+
Connection connection,
35+
Integer preservedTransactionIsolation,
36+
boolean preservedAutoCommitState) {
3537
assertNotNull(connection);
3638
assertTrue(!(connection instanceof LocalTransactionConnection));
3739
this.connection = connection;
3840
this.preservedTransactionIsolation = preservedTransactionIsolation;
3941
this.preservedAutoCommitState = preservedAutoCommitState;
4042
}
4143

42-
protected int getPreservedTransactionIsolation() {
44+
protected Integer getPreservedTransactionIsolation() {
4345
return this.preservedTransactionIsolation;
4446
}
4547

@@ -150,7 +152,6 @@ public DatabaseMetaData getMetaData() throws SQLException {
150152

151153
@Override
152154
public int getTransactionIsolation() throws SQLException {
153-
//noinspection MagicConstant
154155
return connection.getTransactionIsolation();
155156
}
156157

doma-core/src/test/java/org/seasar/doma/jdbc/tx/KeepAliveLocalTransactionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public void setTransactionIsolation(int level) throws SQLException {
106106
new LocalTransactionDataSource(new MockDataSource(connection));
107107
LocalTransaction transaction = dataSource.getKeepAliveLocalTransaction(jdbcLogger);
108108
try {
109-
transaction.begin(TransactionIsolationLevel.READ_COMMITTED);
109+
transaction.begin(TransactionIsolationLevel.SERIALIZABLE);
110110
dataSource.getConnection();
111111
fail();
112112
} catch (JdbcException expected) {

doma-core/src/test/java/org/seasar/doma/jdbc/tx/LocalTransactionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void setTransactionIsolation(int level) throws SQLException {
105105
LocalTransaction transaction = dataSource.getLocalTransaction(jdbcLogger);
106106

107107
try {
108-
transaction.begin(TransactionIsolationLevel.READ_COMMITTED);
108+
transaction.begin(TransactionIsolationLevel.SERIALIZABLE);
109109
dataSource.getConnection();
110110
fail();
111111
} catch (JdbcException expected) {

0 commit comments

Comments
 (0)