【MySQL】锁

本文详细介绍了并发事务访问数据库时可能出现的问题,如脏读、不可重复读和幻读,以及如何通过多版本并发控制和不同类型的锁(如读锁、写锁、表级锁和行锁)来解决这些问题。还探讨了乐观锁和悲观锁的区别,以及死锁的条件、处理方法和避免策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、并发事务访问相同记录的三种情况

  • 读-读情况
      并发事务相继读取相同的记录,不会产生什么问题。

  • 写-写情况
      这种情况下会发生脏写的问题。

  • 读-写或写-读情况
      会发生脏读、不可重复读、幻读的情况

并发问题的解决方案

  • 读操作利用多版本并发控制,写操作进行加锁
  • 读写操作都采用加锁的方式

二、锁的不同分类

2.1、从数据操作角度分:读锁、写锁

  • 读锁共享锁,用S表示,对于同一份数据的读操作可以同时进行不影响,相互不阻塞。
  • 写锁排他锁,用X表示,在当前写操作没有完成前,它会阻断其他写锁和读锁。

锁定读时对读取记录加S锁

SELECT ... LOCK IN SHARE MODE;
#或者
SELECT ... FOR SHARE;

锁定读时对读取记录加X锁

SELECT ... FOR UPDATE;

2.2、从数据操作粒度分:表级锁、页级锁、行锁

  锁粒度是由于数据库系统需要在高并发响应和系统性能两方面进行平衡所产生的概念。

2.2.1、表锁

  该锁会锁定整张表,开销最小且避免了死锁,但是并发效率大打折扣。

表级别的S锁、X锁

  • LOCK TABLES t READInnoDB引擎对表t添加表级别的S锁
  • LOCK TABLES t WRITEInnoDB引擎对表t添加表级别的X锁

  在InnoDB上使用这些语句只会降低并发能力,所以一般不使用。

意向锁
  在一个事务在设置行锁的时候其他事务就需要去遍历这张表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rockict_z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值