事务锁与脏读、不可重复读、幻读

脏读

(两个事务,同时操作对方尚未提交的数据)

脏读又称无效数据读出。一个事务读取另外一个事务还没有提交的数据叫脏读。

例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的。

解决办法:把数据库的事务隔离级别调整到READ_COMMITTED

 

不可重复读:

(事务1内的第一次读取与第二次读取不同,在事务1两次读取的过程中,存在其他事务更改了数据)

不可重复读是指在同一个事务内,两个相同的查询返回了不同的结果。

例如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。 解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ

 

幻读:

(事务1内的第一次读取与第二次读取不同,第二次读取时出现了新数据,)

例如:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入(注意时插入或者删除,不是修改))了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样。这就叫幻读。

解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ

 

本质:

几个隔离级别的本质为:事务之间的锁控制机制不同

可重复读的实现机制:乐观锁,当有事务对数据修改时,会对数据版本+1,原来的事务使用老版本查询,查到的仍是老数据

串行化的实现机制:事务读写锁

 

默认级别

oracle、sqlserver 默认级别为:读已提交

mysql 默认级别为:可重复读

 

参考:

https://www.cnblogs.com/xiaohanlin/p/8644749.html

https://blog.csdn.net/hemeinvyiqiluoben/article/details/80928070

 

posted @ 2019-12-18 21:46  沐风山  阅读(352)  评论(0编辑  收藏  举报