当多个事务同时运行时,可能存在以下4个问题:
1、脏读:
一个事务读到了另一个事务未提交的数据
2、不可重复读:
在同一个事务中,同样的条件,你读取过的数据再次读取出来时发现值不一样了。
例:
在事务1中,Mary 读取了自己的工资为1000,事务没结束,在事务2中,财务人员修改了Mary的工资为2000,并提交了事务 ,在事务1中,Mary 再次读取自己的工资时,工资变为了2000 。
3、幻读:
在同一个事务中,同样的条件,第1次和第2次读出来的记录数不一样。
例:
在事务1中,读取所有工资为1000的员工(10人),在事务2中,向employee表插入了一条员工记录,工资也为1000 ,并提交 ,事务1再次读取所有工资为1000的员工(11人)。
注意:
不可重复读和幻读结果是一致的,但是不可重复读侧重的是修改,而幻读侧重的是新增和删除。
幻读的解决方式是对表加表锁解决-------对表进行集合操作
不可重复读的解决方式可以对特定的行加锁解决。------对行进行操作
4、丢失更新:
一个事务的修改覆盖了另一个事务所做的修改
例:
事务1对id列执行了update操作,修改为5,事务2对id列执行了update操作,将id更改为10,先执行事务1,再执行事务2.此时事务1查看到的id是10,不是5,事务1所做的操作被事务2覆盖掉了,事务1的更新丢失了。
以上所有的4个问题都可以通过不允许两个用户同时运行一个事务来很容易的解决掉:用户1的事务没有结束,用户2的事务就不能开始,这样就不会出错了。但是这样的话,数据库的并发性能极差,不能接受 每个事务都有一个隔离级别(isolation level),它规定了并发运行的两个事务之间是否允许发生上面的问题。