Mysql锁
- 表锁
- Myisam、innodb支持表锁
- 锁的类型
- 读锁
- 语法:lock table 表名 read[,表名2 read];
- 特性:
- 当链接A给table加了读锁之后,该链接只可以读table表,如果读取其他表的数据,会报错,如果想要读取需要给要读取的表通通加上读锁才可以,链接A不可以对表进行写入操作;
- 链接B只可以对加了读锁的表进行读操作,如果执行写入操作,会等待,直到链接A释放读锁
- 写锁
- 语法:lock table 表名 write;
- 特性:
- 链接A给table加了写锁,那么他只可以操作table表,如果想要操作其他表,需要给其他表也加锁才可以,链接A可以对table进行读写的操作
- 链接B无论对table执行读还是写都需要链接A释放锁之后才会执行,否则等待
- 读锁
- 行锁
- innodb支持行锁
- 锁的类型
- 共享锁(乐观锁)
- 语法:select * from 表名 where id=1 lock in share mode;
- 特性:
- 链接A对数据1增加了共享锁之后,该链接可以对该数据执行任何操作
- 链接B可以同时获取该数据1的共享锁,并且可以对该数据进行读取操作,但是当执行删除或者修改数据1的时候,会等待,只有拥有当前数据1的共享锁的链接才可以对该数据执行写入操作
- 当数据1被加了共享锁之后,会阻止其他链接对数据1进增加排他锁
- 排他锁(悲观锁)
- 语法:select * from 表名 where id=1 for update;
- 特性:
- 链接A对数据1增加了排他锁,该链接可以对其执行任何操作
- 其他链接只可以对该数据执行读操作,无法进行写操作,需要等待锁释放
- 当数据1被加了排他锁之后,会阻止其他链接对数据1增加共享锁和排他锁
- 共享锁(乐观锁)
- 在开发中使用锁也需要关闭自动提交,或者在事务内执行
- 应用场景:
-
- 高并发
- 避免对数据表的同时操作,产生数据覆盖
-