Mysql 中的锁

一 锁的分类

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

一、 锁的粒度

表锁

行锁

间隙锁

二 锁的方式

读锁

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 时间戳

你可能感兴趣的:(MySQL)