Mysql复习-锁的概念



一、锁

在数据库中,除传统的计算资源的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对 并发操作进行控制 ,因此产生了 锁 。同时 锁机制 也为实现MySQL的各个隔离级别提供了保证。 锁冲突 也是影响数据库 并发访问性能 的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。

二、MySQL并发事务访问相同记录

1.读-读

读-读 情况,即并发事务相继读取相同的记录 。读取操作本身不会对记录有任何影响,并不会引起什么问题,所以允许这种情况的发生。

2.写-写

写-写 情况,即并发事务相继对相同的记录做出改动。在这种情况下会发生 脏写 的问题,任何一种隔离级别都不允许这种问题的发生。所以在多个未提交事务相继对一条记录做改动时,需要让它们排队执行 ,这个排队的过程其实是通过 锁 来实现的。这个所谓的锁其实是一个内存中的结构 ,在事务执行前本来是没有锁的,也就是说一开始是没有锁结构和记录进行关联的。
当一个事务想对这条记录做改动时,首先会看看内存中有没有与这条记录关联的 锁结构 ,当没有的时候
就会在内存中生成一个锁结构与之关联。比如,事务 T1 要对这条记录做改动,就需要生成一个锁结构与之关联:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 读-写或写-读

读-写 或 写-读 ,即一个事务进行读取操作,另一个进行改动操作。这种情况下可能发生脏读 、不可重复读 、 幻读 的问题。各个数据库厂商对 SQL标准 的支持都可能不一样。比MySQL在REPEATABLE READ 隔离级别上就已经解决了幻读问题。

4. 并发问题的解决

   方案一:读操作利用多版本并发控制,写操作进行加锁 。
  • 普通的SELECT语句在READ COMMITTED和REPEATABLE READ隔离级别下会使用到MVCC读取记录。

  • 在 READCOMMITTED 隔离级别下,一个事务在执行过程中每次执行SELECT操作时都会生成一个ReadView,ReadView的存在本身就保证了 事务不可以读取到未提交的事务所做的更改,也就 是避免了脏读现象;

  • 在REPEATABLE READ 隔离级别下,一个事务在执行过程中只有第一次执行SELECT操作才会生成一个ReadView,之后的SELECT操作都 复用 这个ReadView,这样也就避免了不可重复读和幻读的问题。

     方案二:读写操作都采用加锁的方式。
    

三、锁的分类

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值