参见https://blog.csdn.net/kamputer/article/details/109292200将connection方法修改如下,主要是讲隔离级别设置为Connection.TRANSACTION_READ_UNCOMMITTED
private static Connection connection() {
try {
Class.forName(com.mysql.cj.jdbc.Driver.class.getName());
Connection out= DriverManager.getConnection("jdbc:mysql://172.23.47.6:3306/qbit","root","mima");
out.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
return out;
}catch (Exception e){
throw new RuntimeException(e);
}
}
运行后打印结果如下
update transaction_table set curr_value=1 where id=valueA
valueA | 1
valueB | 0
update transaction_table set curr_value=2 where id=valueA
valueA | 2
valueB | 0
update transaction_table set curr_value=3 where id=valueA
valueA | 3
valueB | 0
update transaction_table set curr_value=4 where id=valueA
valueA | 4
valueB | 0
update transaction_table set curr_value=1 where id=valueB
valueA | 4
valueB | 1
update transaction_table set curr_value=2 where id=valueB
valueA | 4
valueB | 2
update transaction_table set curr_value=3 where id=valueB
valueA | 4
valueB | 3
update transaction_table set curr_value=4 where id=valueB
valueA | 4
valueB | 4
可以看出来write的每个操作都能被read读取出来,这并不奇怪。
将隔离级别设置为Connection.TRANSACTION_READ_COMMITTED
update transaction_table set curr_value=1 where id=valueA
valueA | 0
valueB | 0
update transaction_table set curr_value=2 where id=valueA
valueA | 0
valueB | 0
update transaction_table set curr_value=3 where id=valueA
valueA | 0
valueB | 0
update transaction_table set curr_value=4 where id=valueA
valueA | 0
valueB | 0
update transaction_table set curr_value=1 where id=valueB
valueA | 4
valueB | 0
update transaction_table set curr_value=2 where id=valueB
valueA | 4
valueB | 0
update transaction_table set curr_value=3 where id=valueB
valueA | 4
valueB | 0
update transaction_table set curr_value=4 where id=valueB
valueA | 4
valueB | 0
如果将隔离级别修改为TRANSACTION_REPEATABLE_READ,结果和上面一致,真是让人吃惊,说好的repeatable read呢。即使使用了TRANSACTION_SERIALIZABLE也会读取到数据。