Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
1.5.6
-
None
Description
Transaction isolation level set via Connection#setTransactionIsolation is lost,
when statement are executed on such a connection that trigger an MaxAllowedPacketException.
Although the connection is still usable, it silently switches back to the default isolation behaviour,
Testcase:
public class IsolationLevelLostOnReconnect { |
|
@Test |
public void isolationLevelResets() throws SQLException { |
try (Connection c = DriverManager.getConnection("jdbc:mariadb://localhost:3306/test", "test", "test")) { |
long max = maxPacket(c); |
if (max > Integer.MAX_VALUE - 10) { |
fail("max_allowed_packet to high for this test"); |
}
|
c.prepareStatement("create table if not exists foo (x longblob)").execute(); |
c.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
|
assertThat(level(c), is("READ-UNCOMMITTED")); |
try (PreparedStatement st = c.prepareStatement("insert into foo (?)")) { |
st.setBytes(1, data((int) (max + 10))); |
st.execute();
|
fail();
|
} catch (SQLException e) { |
assertThat(e.getMessage(), containsString("max_allowed_packet")); |
// we still have a working connection |
assertThat(maxPacket(c), is(max));
|
// but our isolation level changed: |
assertThat(level(c), is("READ-UNCOMMITTED")); |
}
|
}
|
}
|
|
private String level(Connection c) throws SQLException { |
try (ResultSet rs = c.prepareStatement("select @@tx_isolation").executeQuery()) { |
rs.next();
|
return rs.getString(1); |
}
|
}
|
|
private long maxPacket(Connection c) throws SQLException { |
try (ResultSet rs = c.prepareStatement("select @@max_allowed_packet").executeQuery()) { |
rs.next();
|
return rs.getLong(1); |
}
|
}
|
|
private byte[] data(int size) { |
byte[] data = new byte[size]; |
Arrays.fill(data, (byte) 'a'); |
return data; |
}
|
}
|
Javadoc on Connection#setTransactionIsolation reads (excerpt):
* Attempts to change the transaction isolation level for this |
* <code>Connection</code> object to the one given.
|
Clearly, this does not hold in this situation.