《InnoDB,5项***实践,知其所以然?》发布后,很多同学留言希望能谈谈MySQL的InnoDB行锁机制。要详细说MySQL的行锁,免不了要从事务的四种隔离级别说起。四种隔离级别都离不开脏读、不可重复读、幻读等问题。事务隔离级别、行锁机制等比较垂直,大部分同学在应用开发中用不到。我不确定他们中的大多数人是否感兴趣。今天,我想先问一个问题。如果你确定你对这类话题感兴趣,后面我会花时间讲这一系列的问题。MySQL默认的事务隔离级别是RepeatedRead(RR)。假设使用的存储引擎是InnoDB,在这种隔离级别下:读取的数据是其他事务提交的数据;同一个事务,同一个连续读,结果应该是一样的;不会有插入幻读;假设有一个数据表:t(idintPK,name)假设当前记录为:10,shenjian20,zhangsan30,lisiCase1先执行事务A,处于Uncommitted状态:updatesetname='a'whereid=10执行事务B之后:updatesetname='b'whereid=10因为事务A在PKid=10上加了行锁,所以事务B会阻塞。情况2事务A先被执行,处于未提交状态:deletefromtwhereid=40事务A要删除一条不存在的记录。在事务B之后执行:insertintotvalues(40,'c')事务B要插入一条主键不冲突的记录。问题一:交易B是否被阻塞?问题2:如果事务B被阻塞了,如何给一条不存在的记录加锁呢?问题三:事务隔离级别和索引类型对问题一和问题二有影响吗?如果你对这些问题感兴趣,我会在后续花时间深入梳理逻辑,画图详谈。如果大家不感兴趣,我就换个数据库应用层架构的话题。这不是一个有趣的问题吗?猜猜InnoDB的行锁是怎么实现的?【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文
