脏读:当事务A在访问数据库,并对数据库进行了修改,但是这个修改还未提交的时候,事务B也来访问这个数据,并使用了这个数据,但是事务A又在B访问之后撤销了操作,这就造成了脏读。
例子:张三给李四转账转了2000元,此时李四查看账户多了2000元,但是张三的转账操作还没有提交,此时,张三撤销了转账,转给李四的2000元也被撤销了。所以李四发生了脏读。
不可重复读:在事务A访问数据库读取信息时,事务B也来访问数据库,并对信息作出了修改,然后提交了修改,此时事务A再次读取数据库信息,发现读取的信息发生了变化。即在事务A的两次查询操作之间,事务B对数据进行了修改,造成事务A两次读取的数据不同。
例子:张三去银行取钱,ATM上显示余额为2000,就在这个同时,李四通过网上转账转走了这2000元,当张三输完密码要取钱时发现,钱没了。这就发生了不可重复读。
幻读:在事务A访问数据库读取信息时,事务B也来访问数据库,并插入了一条数据,然后提交修改,此时事务A再次读取数据信息,发现信息发生了变化。
例子:张三在银行查询自己的账户明细,发现总共消费为2000元,此时李四又用这张卡消费了100元,当张三打印出自己的账户流水时,发现多出了一条花费100元的记录。
注意:猛一看,不可重复读和幻读好像没有什么区别,其实从其控制上看还是有区别的,
* 可重复读的重点在于update与delete,即对单行数据的操作,而幻读的重点在于insert即对表的操作,
* 要想避免不可重复读,只需要在操作时锁住当前正在读写的数据即可,而要避免幻读,需要在操作时锁住正在操作的表。
数据库事务隔离级别
数据库的隔离级别有四个,如图分别解决脏读,不可重复读和幻读。
参考:http://blog.csdn.net/jiesa/article/details/51317164
https://www.cnblogs.com/itcomputer/articles/5133254.html