世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程。 ——摘自周志明

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引擎下,命中索引才会有;
生产注意不要行锁变表锁,并发性查;
间隙锁,会产生死锁。

posted @ 2020-08-14 23:43  白杯与咖啡  阅读(163)  评论(0编辑  收藏  举报