mysql并发控制的机制

1 篇文章 0 订阅
  1. 事务的三个问题
    1.1 脏读: 事务A查看数据,事务B修改数据,导致事务A看到了事务B修改的脏数据,这种现象称为脏读。
    1.2 不可重复读(侧重与数据行的修改):事务A查看数据,事务B修改数据并提交了事务,事务A发现数据被修改了,造成了数据的前后不一致的问题。
    1.3 幻读(侧重与数据行的增加):事务A发现一张表有5条数据,事务B插入了一条数据,并提交数据,事务A发现表变成了6条数据,就像发生了幻觉一样。
  2. 数据库事务隔离级别分别解决了什么问题。
    2.1 读未提交: 三个问题都没有解决
    2.2 读提交:解决脏读。
    2.3 可重复读:解决了脏读、不可重复读、幻读。
    2.4 串行(加的是表锁):解决了脏读、不可重复读、幻读。
  3. Mysql的处理并发有什么方案。
    3.1 MVCC机制,也称为多版本并发控制,这个机制完成了读写操作不冲突。在MVVC中,读操作分成了快照读和当前读
    3.1.1 快照读:普通的查询语句,不需要加锁。从多个快照记录选择一条记录返回。
    3.1.1.1 原理:是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number)。每个写操作都会创建一个新版本,读操作从多个版本中选择一个返回(一般选择从时间戳最大的选择),解决了读写冲突的问题,
    3.1.2 当前读:特殊的查询语句,例如更新,删除等操作,需要加锁。
  4. Mysql中有那些锁。
    4.1 按使用场景来划分。
    4.1.1 共享锁:共享锁时行级别的锁。共享锁之间不互斥。
    4.1.2 意向共享锁:是表级别的锁,它预示着,事务有意向对表中某些行加共享锁。
    4.1.3 排他锁:是行级别的锁。就是独占锁,独占锁与其他锁都互斥。
    4.1.4 意向排他锁:是表级别的锁,它预示着,事务有意向对表中某些行加排他锁。
    4.2 按锁的粒度划分。
    4.2.1 记录锁(Record Locks): 这个锁是加在索引上的,索引查询必须命中索引才能使用这个锁。
    4.2.2 间隙锁(Gap Locks):这个锁也是加载索引上的,但是它能够设置一定的范围,相当于锁定了一定范围的索引数据,也就解决了幻读的情况。
    4.2.3 临键锁(Next-key Locks):临键锁,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间。
  5. Mysql是采用什么锁来解决上述数据一致问题的。
    5.1 读未提交的事务隔离级别的加锁方式。
    5.1.1 A事务读取记录,不加锁
    5.1.2 B事务更新记录,加的是共享锁。
    5.2 读提交的事务隔离级别的加锁方式。
    5.2.1 A事务读取记录,加共享锁,读完马上释放共享锁。
    5.2.2 B事务更新记录,加排他锁,知道事务提交,才释放锁。
    5.2.3 这种方式解决了脏读,A事务看不到B事务未提交的数据。
    5.3 可重复读的事务隔离级别的加锁方式。
    5.3.1 A事务读取记录,加共享锁,一直到事务提交完毕了。
    5.3.2 B事务更新记录,加排他锁,一致到事务提交完毕了。
    5.3.3 解决了不可重复读的问题,因为在A事务读取记录时,B事务不能获取到这个记录的排他锁。其实类是与串行执行。
    5.3.4 解决了幻读的问题,采用了行锁中的(GAP locks)来解决幻读的问题
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值