新说MySQL事务隔离级别!
By default, InnoDB operates in REPEATABLE READ transaction isolation level. In this case, InnoDB uses next-key locks for searches and index scans, which prevents phantom rows (see Section 14.7.4, “Phantom Rows”). 按照原本这句话的意思,应该是 InnoDB默认用了REPEATABLE READ。在这种情况下,使用next-key locks解决幻读问题! 结果估计,某个国内翻译人员翻着翻着变成了 InnoDB默认用了REPEATABLE READ。在这种情况下,可以解决幻读问题! 然后大家继续你抄我,我抄你,结果你懂的! 显然,漏了"使用了next-key locks!"这个条件后,意思完全改变,我们在该隔离级别下执行语句
是快照读,是不加任何锁的,根本不能解决幻读问题,除非你用
这样,你就用上了next-key locks,才能解决幻读问题! 串行读即SERIALIZABLE_READ。在该隔离级别下,所有的select语句后都自动加上lock in share mode。因此,在该隔离级别下,无论你如何进行查询,都会使用next-key locks。所有的select操作均为当前读! ![]() OK,注意看上表红色部分!就是因为在该隔离级别下使用了next-key locks,innodb将pId=1这条索引记录,和(1,++∞)这个间隙锁住了。其他事务要在这个间隙上插数据,就会阻塞,从而防止幻读发生! 有的人会说,你这第二次查询的结果,也变了啊,明显和第一次查询结果不一样啊?对此,我只能说,请看清楚啊。这是被自己的事务改的,不是被其他事物修改的。这不算是幻读,也不是不可重复读。 总结上面罗里吧嗦一大堆,最后来一个表格做总结吧,你面试答这个表就行。上面的一切是为了这张表做准备! 【编辑推荐】
点赞 0 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |