MySQL的锁

        MySQL的锁机制主要用于管理并发事务对数据的一致性和完整性的访问控制,主要分为以下几种类型:

1.行级锁
  • 行级锁是MySQL中锁定粒度最细的锁,只针对当前操作的行进行加锁。
  • 优点在于开销小、并发性能高,适用于InnoDB存储引擎。
  • InnoDB支持两种行级锁:共享锁(S锁,也叫读锁),多个事务可以同时获得同一数据行的共享锁;排他锁(X锁,也叫写锁),一个事务对某一行加上了排他锁后,其他事务不能再对该行加任何类型的锁。
2.表级锁
  • 表级锁是对整个数据表进行加锁,MyISAM存储引擎默认使用的就是表级锁。
  • 表级锁的开销小,加锁快,但锁定粒度大,发生锁冲突的概率相对较大,并发性能较差。
  • 包括读锁(共享锁)和写锁(排他锁),在MyISAM中,一个表只能有一个写锁,但可以有多个读锁。
3.乐观锁与悲观锁

        在 MySQL 中,乐观锁和悲观锁是两种处理并发访问的不同策略。

        乐观锁(Optimistic Locking)

        乐观锁假设在大多数情况下,数据不会发生冲突,因此在读取数据时不会加锁。当要更新数据时,它会检查在读取数据后是否有其他事务对数据进行了修改。通常,乐观锁会使用版本号或时间戳等机制来检查数据是否被修改。

        悲观锁(Pessimistic Locking)

        悲观锁则是假设数据在大多数情况下会发生冲突,因此在读取数据时会加锁,直到事务完成后才会释放锁。悲观锁适用于并发写入较多的场景,但是会增加系统开销并可能降低并发性能。

说明:

  1. InnoDB的行级锁:InnoDB存储引擎支持行级锁,这是为了支持高并发的读写操作。行级锁可以最大限度地减少锁竞争,提高并发性能。
  2. 死锁:当两个或多个事务相互等待对方释放资源时,就会发生死锁。InnoDB有一个死锁检测机制,当检测到死锁时,它会主动回滚其中一个事务,从而解决死锁。
  3. 记录锁:锁定单个行记录。
  4. 间隙锁:锁定一个范围,但不包括记录本身。这主要用于防止幻读。
  5. Next-Key 锁:是记录锁和间隙锁的组合,锁定一个范围并包括记录本身。

锁升级

        在某些情况下,为了避免死锁或提高性能,数据库可能会决定升级锁,例如从行级锁升级到表级锁。

锁的粒度

        锁的粒度指的是锁所覆盖的数据范围。例如,表级锁的粒度是整个表,而行级锁的粒度是表中的单个行。

        在实际开发中,为了保证数据一致性,我们需要根据业务场景合理选择合适的锁策略,避免长时间持有不必要的锁,减少锁等待和死锁的发生。例如,在进行更新或者删除操作时,尽量通过主键或唯一索引进行条件查询并获取行锁,以提高并发处理能力。

      另外,选择乐观锁还是悲观锁取决于数据访问的模式、应用的并发情况以及对性能的要求。通常情况下,如果并发冲突较少,乐观锁是一个较好的选择,因为它不会阻塞其他事务;而如果并发冲突较多,悲观锁可能更适合,因为它可以确保数据的一致性。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值