这篇文章将为大家详细讲解有关怎样解决MySQL数据库在RR隔离级别下容易产生幻读的问题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。PartⅠ 问题回顾幻读的定义:幻读是指某个事务读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前事务再次读取该范围内的记录时就会产生幻行。举一个例子,user表中id是主键索引,T1是主事务:T2是干扰事务:Step1:T1开始,并检查user表中是否有id=1的记录。Step2:T2开始,插入id为1的记录且成功执行。Step3:T1查到没有id=1的记录就开始插入id=1的记录,但是失败了(主键冲突)。Step4:T1不能接受现实又查了一遍是否存在id=1的记录,发现的确没有,彻底崩溃…从第四步我们可以看出,在主事务执行commit之前,不管再查多少次,都无法获取到id=1的这条记录,因为此时它已经产生幻读了。要解决幻读的问题有两种方案,一种是采用SERIALIZABLE 数据隔离级别,但是这种方案会强制把所有事务排序,来达到事务之间不互相冲突产生幻读的问题,当事务并发高的时候,很容易产生大量超时和锁竞争的情况,所以一般不太建议采用这种方案。另一种方案是采用在RR数据隔离级别下,手动给select操作加上x锁(排它锁)或者s锁(共享锁),下面就具体介绍一下x锁和s锁。共享锁(SELECT … LOCK IN SHARE MODE)即一个事务获取一条记录共享锁的同时,其他事务也可以获得这条记录的共享锁,但是如果同时有多个事务获得这条记录的共享锁,谁也无法修改这条记录,直到都释放掉共享锁,只剩下一个事务拥有这条记录的锁为止。排它锁(SELECT … FOR UPDATE)即一个事务获得了一条记录的排它锁的同时,其他事务就不能获得这条记录的共享锁和排它锁,也无法修改这条记录,直到这个事务释放掉锁为止。相同点:一个事务在获得一条记录的共享锁免费主机域名或者排它锁的同时,其他事务都不能修改这条记录,直到这个事务释放掉锁为止。不同点:排它锁比共享锁多阻塞了其他事务对相同记录的共享锁,但是不影响快照读。共享锁:排它锁:那共享锁和排它锁是否能互相代替呢,这要看具体的场景,像上面两个例子就不行,第一个例子如果用了排它锁就会造成一个用户在操作工会的时候,其他用户就不能获取这条记录共享锁的情免费主机域名况。第二个例子如果使用共享锁的话,其他事务都能获得goods表这条记录的共享锁,会导致谁也更新不了剩余数量这个值的情况。所以共享锁和排它锁都有各自的作用,不能互相替代。关于怎样解决MySQL数据库在RR隔离级别下容易产生幻读的问题就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
相关推荐: ONLINE方式在线重建索引异常中断后遇到ORA-08104错误的处理思路是什么
这篇文章将为大家详细讲解有关ONLINE方式在线重建索引异常中断后遇到ORA-08104错误的处理思路是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 select i.obj#, i.flags, u.n…