在老师演示脏读的操作的时候,当更新时查询到脏读,但是更新结束后并没有提交更新的结果,所以更新结束后读到的应该还是脏读前(更新前)的数据才对,但是这里和老师的演示不一致。看了下弹幕修改了一下,将finally语段中的conn.setAutoCommit(true)给注释掉或者删去,如下:
public static int update(Connection conn,String sql,Object...args){
PreparedStatement ps= null;
try {
ps = conn.prepareStatement(sql);
for (int i=0;i<args.length;i++){
ps.setObject(i+1,args[i]);
}
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
/*try {
conn.setAutoCommit(true);
} catch (SQLException throwables) {
throwables.printStackTrace();
}*/
JDBCUtils.closeResource(null,ps);
}
return 0;
}
由于之前老师说,最好在更新后将事务设置为自动提交,所以这里有如下设置:
try {
conn.setAutoCommit(true);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
但是在更新操作中先将事务的自动提交给取消了,但是调用了update函数之后,按照先前的做法,在update函数中又将自动提交打开了,所以可能会导致更新操作的提交,导致结果的错误(本人的猜测),所以这里将这段注释掉就可以,测试结果是正确的。
@Test
public void testTransactionUpdate() throws Exception{
Connection conn=JDBCUtils.getConnection();
conn.setAutoCommit(false);
String sql="update user_table set balance=? where user=?";
update(conn,sql,6000,"CC");
Thread.sleep(20000);
System.out.println("修改结束");
}