中职电子商务网站建设与维护考试题,低价网站建设要多少钱,专业的河南网站建设公司哪家好,建设银行网站上交医保幻读指的是#xff0c;在同一个事务中#xff0c;以同样的条件执行的两次查询#xff0c;第二次查询查到了第一次查询所没查到的数据。 在mysql的四种隔离级别中#xff0c;可重复读和串行化两种隔离级别没有幻读问题。那么它们是如何解决幻读问题的呢#xff1f; 先说串行… 幻读指的是在同一个事务中以同样的条件执行的两次查询第二次查询查到了第一次查询所没查到的数据。 在mysql的四种隔离级别中可重复读和串行化两种隔离级别没有幻读问题。那么它们是如何解决幻读问题的呢 先说串行化这个隔离级别串行化是通过加锁的方式让事务按照顺序串行执行事务会对整张表加锁读操作时加共享锁写操作时加排它锁总之事务会对整张表加锁并且这个锁要到事务结束时才释放所以串行化这个隔离级别根本就不会有幻读问题。 再说可重复读在可重复读这个隔离级别下快照读是不会有幻读问题的【也可以说快照读用MVCC避免了幻读问题】只有当前读会有幻读问题那么什么是快照读和当前读呢 快照读读的是快照数据是由MVCC机制实现的因为读的是快照数据所以即便是有其他事务并发修改了数据或者添加了新的数据也不会对当前事务的快照读造成影响因为当前事务的快照读读的是同一个版本的快照所以快照读不会有幻读问题。读已提交 和 可重复读这两种隔离级别下的所有的普通的select查询都是快照读除了快照读之外就都是当前读了。 当前读读的永远都是最新版本的数据当前读会对这些数据加锁以避免其他的事务并发去修改这些数据当前读包括 1、加共享锁的selectselect * from user lock in share mode; 2、加排它锁的select select * from user for update; 3、增删改操作insert、delete、update。虽然看起来增删改操作与读无关但其实在增删改之前都要先执行当前读以将符合条件的数据锁起来避免其他事务并发去修改它们。 当前读为什么会有幻读问题呢 虽然当前读能够将符合条件的数据加锁以阻塞其他事务对于这些数据的修改却不能够避免其他事务添加新的数据而其他事务添加的新的数据有可能对于当前事务的当前读造成影响一旦其他事务所添加的数据是满足我们当前读的条件的那么当我们在当前事务中再以同样的条件执行一次当前读时就会读到其他事务添加的那条新的数据幻读就发生了。分析一下原因幻读问题的发生是因为当前读所加的行锁只是锁住了数据库中已存在的满足条件的记录却不能够避免其他事物添加新数据的操作。为了解决这个问题InnoDb存储引擎引入了间隙锁。 间隙锁 同行锁锁住满足条件的行不同间隙锁锁住的是行之间的间隙当为某些间隙添加了间隙锁其他事务就不能往这些间隙中添加新的数据了比如当前读的条件是 5id10那么行锁锁住的是id落在5到10之间的行而间隙锁锁住的是5到10之间的间隙如果有其他事务想要添加新的数据而新数据的id在5到10之间那么这个添加请求将被阻塞。 可重复读在当前读模式下用行锁间隙锁来解决了幻读问题行锁间隙锁又叫Next-Key Lock。