行锁。Innno引擎实现了以下两种类型的行锁:
1、共享锁(S): 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。 简单说就是共享锁之间兼容,共享锁与排他锁互斥
2、排他锁(X): 允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。 简单说就是如果第一个事务获取到某行数据的排他锁,那么后续其他事务就不可以再获取这行数据的 共享锁及排他锁
当我们执行对应的SQL语句,就会产生对应的锁,可以是自动加的锁,也可以是手动加的锁。如下
SQL语句 | 行锁类型 | 说明 |
---|---|---|
insert | 排他锁 | 自动加锁 |
update | 排他锁 | 自动加锁 |
select | 不加任何锁 | 无 |
select...lock in share mode | 共享锁 | 需要手动在select之后在lock in share mode |
select...for update | 排他锁 | 需要手动在select之后加for update |
行锁演示。注意默认情况下,InnoDB引擎在repeatable read事务隔离级别运行,InnoDB使用 临键锁(next-key)进行搜索和索引扫描,以防止幻读。
1、对于唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁
2、InnoDB的行锁是对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁, 此时就会升级为表锁
如何查看意向锁及行锁的加锁情况,如下
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
我们用代码演示上面的两种行锁,见对于sql文件