Mysql 中的锁

一 锁的分类

  • 粒度:表锁 / 行锁 / 间隙锁
  • 方式:读锁(共享锁) / 写锁(排他锁)
  • 态度:悲观锁 / 乐观锁
    • 悲观锁 (读锁、写作都是悲观锁)
    • 乐观锁 (乐观锁,需要外部程序实现)

一、 锁的粒度

表锁

行锁

间隙锁

二 锁的方式

读锁

T1表加了读锁,T1表将只能读不能写。同时【加锁线程】受到限制:不能再访问别的表。

举例,

  • A 进入厕所的1号隔间,不关隔间门(使用读锁),
  • B 可以看到这个隔间发生了什么(其他线程能读),但不能再使用这个隔间。
  • A 因隔间门没关,所以也不能执行写操作,还不能访问其他隔间。

A 线程 对 table1 加 了读锁

# 加锁
lock table table1 read;
线程操作table1table2说明
ARO-A 线程只能都自己的 table1
AW--没有写的权力
BROOB 线程对 table1 的读权力没有受到限制。
BW-OB 线程对 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 时间戳

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值