Mysql 锁
锁分类
- 行锁
- 间隙锁
- 表锁
行锁(锁原理是基于索引的,如果不命中索引就会升级为表锁,注意Innodb存储引擎)
1、查自动提交是否关闭
命令行打开两个窗口,窗口1关闭自动提交
show variables like 'autocommit';
--关闭自动提交
set autocommit=0;
select * from user;
+----+--------+--------+
| id | xuehao | name |
+----+--------+--------+
| 1 | 110 | stu1 |
| 2 | 111 | stu10 |
| 12 | 112 | stu20 |
+----+--------+--------+
在窗口1中更新一行数据,执行如下语句:
start transaction;
begin;
update user set name='stu2' where id=1;
执行完,打开窗口2,也来更新该记录,发现SQL不能执行
update user set name='stu3' where id=1;
这是时在窗口1手动提交事务,执行commit,在切换回窗口2发现SQL被执行。
2、表锁
思路:xuehao列没有索引,根据学号列更新,测试升级为表锁。
窗口1中,
set autocommit=0;
start transaction;
begin;
update user set name='stu2' where xuehao='110';
窗口2,执行SQL会被卡主
update user set name='stu2' where xuehao='112';
最后,切到窗口1,提交事务commit;窗口2的SQL才会执行。
3、间隙锁
事务隔离级别:可重复读,当保证范围查询,事务内不可变,需要间隙锁。
间隙锁,查询对应的条件列上没有索引或者非唯一索引,间隙锁是左开右闭的。
总结:
注意行锁,在innodb引擎下,命中索引才会有;
生产注意不要行锁变表锁,并发性查;
间隙锁,会产生死锁。