MySQL锁机制

1 数据库锁的分类

1 按照锁的粒度划分

  • 表级锁
  • 行级锁
  • 页级锁

2 按照锁的级别划分

  • 共享锁
  • 排它锁

3 按照使用方式划分

  • 乐观锁
  • 悲观锁

2 行级锁、表级锁、页级锁

2.1 行级锁

行级锁是 MySQL 中锁定粒度最细的一种锁,表示只针对当前行进行加锁。行级锁分为共享锁和排他锁。

特点

  • 开销大,加锁慢;
  • 会出现死锁;
  • 锁定粒度最小,发生锁冲突的概率最低,并发度最高;

2.2 表级锁

表级锁时 MySQL 中锁定粒度最大的一种锁,表示对当前操作的整张表进行加锁。最常用的 MyISAM 和 InnoDB 都支持表级锁。

特点

  • 开销小,加锁快;
  • 不会出现死锁;
  • 锁定粒度最大,发生锁冲突的概率最高,并发度最低;

2.3 页级锁

页级锁是 MySQL 中锁定粒度介于表级锁和行级锁之间的一种锁。

特点

  • 开销和加锁时间介于表级锁和行级锁之间;
  • 会出现死锁;
  • 锁定粒度介于表锁和行锁之间,并发度一般;

在这里插入图片描述

3 共享锁和排他锁

3.1 共享锁(S)

  • 共享锁(Shared)又称读锁,是读取操作创建的锁;
  • 如果事务 T 对数据 A 加上共享锁后,则其他事务只能对 A 再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据;

3.2 排他锁(X)

  • 排他锁(eXclusive)又称写锁;
  • 如果事务 T 对数据 A 加上排他锁后,则其他事务不能再对 A 加上任何类型的锁。获取排他锁的事务既能读数据,又能修改数据;

共享锁和排他锁的兼容关系如下

-XS
X冲突冲突
S冲突兼容

4 意向锁

意向锁是表级锁,但表示事务正在读写某一行记录,而不是整个表。所以意向锁之间不会发生冲突,真正的冲突发生在加行锁时检查。

4.1 意向共享锁(IS)

表示事务准备给数据行加共享锁,也就是说事务在一个数据行加共享锁前必须先获取该表的 IS 锁。

4.2 意向排他锁(IX)

表示事务准备给数据行加排他锁,也就是说事务在一个数据行加排他锁前必须先获取该表的 IX 锁。

5 悲观锁和乐观锁

5.1 悲观锁

  • 悲观锁机制认为每一步如果不采取同步措施都会出现问题,依赖于数据库的锁机制。关系型数据库里边就用到了很多悲观锁机制,比如行锁、表锁等,读锁、写锁等,都是在做操作之前先上锁;
  • 如果锁定时间过长,用户长时间无法访问,会影响程序的并发访问;

5.2 乐观锁

先执行,如果存在冲突,则采取一个补偿措施(比如告知用户失败)。一般有 2 种实现方式:

  • 使用版本号
  • 使用时间戳
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellosc01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值