在RC和RR下innodb的锁

事务:

  事务是数据库区别与文件系统的重要特性之一,锁为事务服务,实现事务的特性,先来简单回归一下事务的各种特性。



事务的ACID特性:

事务有四种特性来保证事务能够很好地为我们服务。

原子性(atomicity) 一个事务要么全部执行,要么全部失败
一致性(consistency) 事务将数据库从一种一致的状态转变为下一种一致的状态,数据库的完整性约束没有被破坏
隔离性(isolation) 不同的事务之间不应该相互干扰
持久性(durability) 事务一旦提交就应该是永久改变的

事务三种常见问题:


  事务在并发场景下会产生三种常见问题。

脏读 一个事务修改了数据,还没有提交就被另一个事务访问到
不可重复读 一个事务中,第一次读到的数据值和第二次读到的数据值不一致。(读到了update未提交的内容)
幻读 一个事务中,第一次读到的数据量和第二次读到的数据量不一致。(读到了insert未提交的内容)


事务的四种隔离级别:

  为了解决这三种问题,提出了四种经典的事务隔离级别,其中RC和RR使用最为广泛。



Read uncommitted 读未提交 毫无隔离性可言
Read committed 读已提交 解决脏读
Repeatable read 重复读 解决不可重复读
Serializable 串形化 解决幻读

Tips:
- mysql的默认隔离级别为RR(repeatable read)

锁:

  锁为事务服务,是实现事务的具体方式。与很多数据库引擎相比,innodb引擎不存在锁升级的问题,其根据事务访问的每个页来对行锁进行管理,采用位图的方式。因此无论一个事务锁住页中的一条记录还是多条记录,其开销通常是一致的。

按兼容性划分:

S锁 共享锁(读锁) 并发读之间不会相互阻碍
X锁 排他锁(写锁) 同一时间只能有一个X锁
IS锁 意向共享锁 表示当前表有活跃事务在给某些行上S锁
IX锁 意向排他锁 表示当前表有活跃事务在给某些行上X锁

Tips:
- 意向锁的作用是可以快速判断当前表是否有活跃的事务在给其中某些行上锁,是提高并发的一种手段。

按模式划分:

Record 记录锁 行锁都是加在索引上的,表示对该行数据的读锁或者写锁
GAP 间隙锁 给两个相邻索引叶子结点之间上锁,避免其他事务在此区间内插入数据
Next-key 下一键锁 下一键锁 = 两个相邻索引叶子结点之间的间隙锁 + 右边界叶子结点的记录锁
II-GAP 插入意向锁 在insert操作将要执行时首先获取该区间的插入意向锁,插入意向锁之间并不会冲突,但和间隙锁、下一键锁冲突。设计可以满足多个insert并发,但和区域select互斥
Auto-Inc 自增锁 锁定自增资源本身,在获取自增id后,立即释放

锁兼容矩阵:

表锁开销小、加锁快;但粒度大,并发度低。
行锁开销大、加锁慢;但粒度小,并发度高。

表兼容矩阵:

  上边一行是已有的锁,左侧一列是要加的锁

S锁 X锁 IS锁 IX锁
S锁 Y Y
X锁 </
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值