mysql行锁怎么使用 mysql 行锁锁住的是什么( 二 )


select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_lock;
行级锁,每次操作锁住对应的行数据,锁定粒度最?。?发生锁冲突的概率最高,并发读最高,应用在innodb存储引擎中 。
innodb的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁,对于行级锁,主要分为以下三类:
1、行锁或者叫record lock记录锁 , 锁定单个行记录的锁,防止其他事物对次行进行update和delete操作,在RC,RR隔离级别下都支持 。
2、间隙锁Gap lock,锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事物在这个间隙进行insert操作 , 产生幻读,在RR隔离级别下都支持 。
3、临键锁Next-key-lock,行锁和间隙锁组合,同时锁住数据 , 并锁住数据前面的间隙Gap,在RR隔离级别下支持 。
innodb实现了以下两种类型的行锁
1、共享锁 S: 允许一个事务去读一行 , 阻止其他事务获得相同数据集的排他锁 。
2、排他锁 X: 允许获取排他锁的事务更新数据 , 阻止其他事务获得相同数据集的共享锁和排他锁 。
insert 语句 排他锁 自动添加的
update语句 排他锁 自动添加
delete 语句 排他锁 自动添加
select 正常查询语句 不加锁。。。
select。。。lock in share mode 共享锁 需要手动在select 之后加lock in share mode
select。。。for update 排他锁 需要手动在select之后添加for update
默认情况下,innodb在repeatable read事务隔离级别运行,innodb使用next-key锁进行搜索和索引扫描,以防止幻读 。
间隙锁唯一目的是防止其它事务插入间隙,间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用的间隙锁 。
MySQL - for update 行锁 表锁for update 的作用是在查询的时候为行加上排它锁,当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新 。
它的典型使用场景是 高并发并且对于数据的准确性有很高要求,比如金钱、库存等 , 一般这种操作都是很长一串并且开启事务的 , 假如现在要对库存进行操作,在刚开始读的时候是1,然后马上另外一个进程将库存更新为0mysql行锁怎么使用了,但事务还没结束,会一直用1进行后续的逻辑,就会有问题,所以需要用for upate 加锁防止出错 。
行锁的具体实现算法有三种:record lock、gap lock以及next-key lock 。
只在可重复读或以上隔离级别下的特定操作才会取得 gap lock 或 next-key lock , 在 Select、Update 和 Delete 时,除了基于唯一索引的查询之外,其它索引查询时都会获取 gap lock 或 next-key lock , 即锁住其扫描的范围 。主键索引也属于唯一索引,所以主键索引是不会使用 gap lock 或 next-key lock
for update 仅适用于InnoDB , 并且必须开启事务,在begin与commit之间才生效 。
select 语句默认不获取任何锁 , 所以是可以读被其它事务持有排它锁的数据的mysql行锁怎么使用!
InnoDB 既实现了行锁,也实现了表锁 。
当有明确指定的主键/索引时候,是行级锁,否则是表级锁
假设表 user,存在有id跟name字段 , id是主键,有5条数据 。
明确指定主键,并且有此记录 , 行级锁
无主键/索引,表级锁
主键/索引不明确,表级锁
明确指定主键/索引 , 若查无此记录,无锁
参考博文:
MySQL如何锁定一行及如何分析行锁定注意事项:session1中没有commit之前,该数据行是锁定的,其他的session修改该行数据时会进入堵塞状态 。

推荐阅读