一 锁的分类
- 粒度:表锁 / 行锁 / 间隙锁
- 方式:读锁(共享锁) / 写锁(排他锁)
- 态度:悲观锁 / 乐观锁
- 悲观锁 (读锁、写作都是悲观锁)
- 乐观锁 (乐观锁,需要外部程序实现)
一、 锁的粒度
表锁
行锁
间隙锁
二 锁的方式
读锁
T1表加了读锁,T1表将只能读不能写。同时【加锁线程】受到限制:不能再访问别的表。
举例,
- A 进入厕所的1号隔间,不关隔间门(使用读锁),
- B 可以看到这个隔间发生了什么(其他线程能读),但不能再使用这个隔间。
- A 因隔间门没关,所以也不能执行写操作,还不能访问其他隔间。
A 线程 对 table1 加 了读锁
# 加锁
lock table table1 read;
线程 | 操作 | table1 | table2 | 说明 |
---|---|---|---|---|
A | R | O | - | A 线程只能都自己的 table1 |
A | W | - | - | 没有写的权力 |
B | R | O | O | B 线程对 table1 的读权力没有受到限制。 |
B | W | - | O | B 线程对 table1 的写权力受限。 |
写锁
三 加锁的态度
悲观锁
悲观锁任务我要用数据,数据肯定会被动先加锁再说。
读锁,写锁都属于悲观锁。
乐观锁
- 乐观锁认为,我在更新的时候别人不会改。先执行一遍如果执行不成功,就再执行一次。
- 实现方式1 ,使用统计字段
- 实现方式2, 使用时间戳
- 两种实现方式原理一样
实现方式1 使用统计字段,或者版本字段。
# 1 查询,统计值
select upcount1 from table ;
> 查询结果 upcount1 = 3
# 2 执行,更新
update name='xiaoxiao' , upcount=upcount+1 where id = 1 and upcount=3 (这里的3 是上一步的查询结果)
upcount1 就是乐观锁的实现。
实现方式2 时间戳