目录

  • 表锁
  • 读锁
  • 写锁
  • 总结:
  • 行锁
  • 总结


表锁

读锁

下面我们为user_info表加read锁,针对——session1

command mysql 锁表 mysql锁表操作_bc

查询自己锁定的表

command mysql 锁表 mysql锁表操作_command mysql 锁表_02


查询未锁定的表

command mysql 锁表 mysql锁表操作_command mysql 锁表_03


多锁定的表进行更新或者插入

command mysql 锁表 mysql锁表操作_command mysql 锁表_04

针对——session2

查询锁定的表

command mysql 锁表 mysql锁表操作_command mysql 锁表_05


查询未锁定的表

command mysql 锁表 mysql锁表操作_bc_06


更新锁定的表,处于阻塞状态

command mysql 锁表 mysql锁表操作_阻塞状态_07


锁定的表,释放锁,session2更新成功,将abc改为ab。

command mysql 锁表 mysql锁表操作_阻塞状态_08

写锁

多user_info加写锁——针对session1

command mysql 锁表 mysql锁表操作_阻塞状态_09


查询锁定的表

command mysql 锁表 mysql锁表操作_阻塞状态_10


对锁定的表进行更新

command mysql 锁表 mysql锁表操作_bc_11


查询未锁定的表

command mysql 锁表 mysql锁表操作_command mysql 锁表_12


释放锁

command mysql 锁表 mysql锁表操作_command mysql 锁表_13


针对——session2

查询锁定的表,一直处于阻塞态

command mysql 锁表 mysql锁表操作_bc_14

查询成功

command mysql 锁表 mysql锁表操作_阻塞状态_15

总结:

总结读锁
Session1
1. 加读锁
2. 可以查自己锁定的表
3. 不可以查询其他没有锁定的表
4. 不能对读锁定的表进行插入或更新

Session2
1. 可以查询锁定的表,其他未锁定的表也可以查询
2.不能对锁定的表进行插入或更新,处于等待,等session1释放锁

总结写锁
session1
1.加写锁
2.查询锁定的表
3.可以对锁定的表进行更新
4.不可以查询未锁定的表

Session2
1.查询锁定的表,处于阻塞,等待释放锁,才可以访问。
2.可以查询未锁定的表
3.对锁定的表进行修改,处于阻塞,等待释放锁,才可以,和查询类似。

行锁

行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

关闭自动提交

set autocommit=0;        // 0关闭,1开启

command mysql 锁表 mysql锁表操作_读锁_16


查询product_info

command mysql 锁表 mysql锁表操作_阻塞状态_17


更新一条数据

command mysql 锁表 mysql锁表操作_阻塞状态_18


再次查询,从6变为10

command mysql 锁表 mysql锁表操作_command mysql 锁表_19


查询session2,依然是6

command mysql 锁表 mysql锁表操作_command mysql 锁表_20


提交session1

command mysql 锁表 mysql锁表操作_bc_21


查询session2

command mysql 锁表 mysql锁表操作_阻塞状态_22


session2提交再查询

command mysql 锁表 mysql锁表操作_读锁_23


session1 更新查询

command mysql 锁表 mysql锁表操作_bc_24

总结

session1

1.关闭自动提交

2.更新不提交,没有commit

3.commit

Session2

1.关闭自动提交

2.处于阻塞状态,一直等待

3.接触阻塞,更新正常进行,需要commit

command mysql 锁表 mysql锁表操作_读锁_25