InnoDB行锁,如何锁住一条不存在的记录?

开发 开发工具
《InnoDB,5项最佳实践,知其所以然?》发布后,不少同学留言希望讲讲MySQL的InnoDB行锁机制。要细聊MySQL的行锁,难以避免的要从事务的四种隔离级别说起。

InnoDB,5项***实践,知其所以然?》发布后,不少同学留言希望讲讲MySQL的InnoDB行锁机制。要细聊MySQL的行锁,难以避免的要从事务的四种隔离级别说起。

四种隔离级别,又脱不开聊读脏,不可重复读,读幻象等问题。

事务隔离级别,行锁机制等都比较垂直,应用开发中大部分同学都用不到,不确定是否大部分朋友都感兴趣。

今天,先抛出一个问题,如果大家确定对这类话题感兴趣的话,后续我花时间细聊这一系列问题。

[[241516]]

MySQL默认的事务隔离级别是 Repeated Read (RR),假设使用的存储引擎是InnoDB,在这个隔离级别下:

  • 读取到数据,都是其他事务已提交的数据;
  • 同一个事务中,相同的连续读,得到的结果应该是相同的;
  • 不会出现insert幻象读;

假设有数据表:

  1. t(id int PK, name) 

假设目前的记录是:

  • 10, shenjian
  • 20, zhangsan
  • 30, lisi

Case 1

事务A先执行,并且处于未提交状态:

  1. update t set name=’a’ where id=10 

事务B后执行:

  1. update t set name=’b’ where id=10 

因为事务A在PK id=10上加了行锁,因此事务B会阻塞。

Case 2

事务A先执行,并且处于未提交状态:

  1. delete from t where id=40 

事务A想要删除一条不存在的记录。

事务B后执行:

  1. insert into t values(40, ‘c’) 

事务B想要插入一条主键不冲突的记录。

  • 问题1:事务B是否阻塞?
  • 问题2:如果事务B阻塞,锁如何加在一条不存在的记录上呢?
  • 问题3:事务的隔离级别,索引类型,是否对问题1和问题2有影响呢?

如果大家对这些问题感兴趣,后续我花时间深入梳理逻辑,画图细聊。

如果不感兴趣,我换数据库应用层架构的话题。

是不是很有意思的一个问题?

猜猜InnoDB的行锁是怎么做到的?

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2018-08-27 08:31:25

InnoDBMySQL

2010-05-17 18:03:31

MySQL 数据库

2022-05-25 08:01:37

WHERESQL 语句

2024-04-19 07:31:58

MySQL数据库

2024-12-13 08:25:59

DML操作SQL

2021-01-25 07:21:24

GitHub 开源代码下载

2023-09-12 08:02:13

viewport断点

2018-07-19 06:14:09

2018-07-03 14:20:10

数据库恢复备份

2024-07-22 08:03:55

2011-05-12 14:43:57

MYSQL

2020-11-03 10:23:22

云计算容器技术

2015-10-20 10:30:59

创业时机

2009-09-12 09:34:18

Windows 7中国售价

2010-01-05 13:52:02

2017-12-07 14:57:13

404互联网错误代码

2017-12-26 08:25:57

硬盘数据丢失

2012-05-16 11:35:16

SQL Server拒绝访问

2019-12-31 09:11:01

后台Android系统

2021-09-12 07:26:49

MySQL SQL 语句数据库
点赞
收藏

51CTO技术栈公众号