背大家都会背
谈到事务隔离级别,背基本是人人都会背的。无非就是读未提交,读已提交,可重复读,串行化等等。。。但是就算背上了,就真的理解的事务的特性了么。
前两天在和同事讨论的时候,他问了我一个这样的问题。多个事务,同时执行 set a = a-1 where a = 1 这个逻辑的时候,有没有可能导致 a 会小于0? 说实话,我还是挺惊讶一个工作两三年的开发,居然会问出这种问题。然后前两天在脉脉上也看到了类似的讨论,居然一大群人还分析的头头是道。。。
能写个demo测试一下就搞定的事情,为什么非要用嘴巴争呢。
事务隔离的特性
数据库有增删改查四种操作,进一步总结一下,就只有 ‘读’ 和 ‘写’ 两种操作而已。关于读操作,就是大家都会背的那四种隔离级别。那关于写操作呢?其实你没有听过任何关于写操作的隔离级别是有原因的,那就是:写本身就是串行化的操作!
一般情况下,mysql是以行锁来控制事务的行为的。也就是当你试图修改一行数据的时候,如果有其它事务修改了这行数据,但是还未提交的话,你的修改会一直阻塞在这里,直到先前的事务提交。这就是写操作的串行化!
最后,代码都准备好了,拿回去试试吧,能动手多动手,不要纸上谈兵。
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url,username,password);
connection.setAutoCommit(false);
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
String update = "update tb_liuyu set address = 'beijin' where id = 1";
PreparedStatement preparedStatement = connection.prepareStatement(update);
preparedStatement.execute();
System.out.println("update count is :"+preparedStatement.getUpdateCount());
connection.commit();
}