1.3.MySQL并发控制

2019-11-09  本文已影响0人  老苏GO

MySQL并发控制

确保事务隔离性的方法之一: 要求对数据项以互斥的方式进行访问. 换句话说, 当一个事务访问某个数据项时, 其他任何事务都不能修改该数据项. 实现该需求的最常用的方法: 只允许事务访问当前该事务持有锁(lock)的数据项.

每个事务都要根据对数据项的操作类型进行申请(request)适当的锁. 该事务将请求发送给并发控制管理器. 事务只有在并发控制管理器授予(grant)所需锁后才能继续其操作. 这两种类型(共享锁|排他锁)可以让多个事务读取同一个数据项但是限制同时只能有一个事务进行写操作.

锁的授予必定是在事务申请锁操作与事务的下一个动作的间隔内.

死锁: 产生死锁比产生不一致状态要好, 因为死锁可以通过回滚事务加以解决, 而不一致状态可能引起现实中的问题, 这是数据库系统不能处理的.

锁的授予: 当事务申请对一个数据项加某一类型锁,且没有其他事务在该数据项上加上了与此类型相冲突的锁, 则可以授予锁.

事务饿死(starved): 事务2在数据项上持有共享锁,事务1申请加排他锁. 事务1需要等待事务2释放共享锁. 同时事务3对数据项申请加共享锁, 加锁请求是相容的,则可授权事务3加共享锁. 如果存在一个事务序列, 每个事务都对数据项加共享锁, 导致事务1总是不能在数据项上加排他锁, 事务1永远没有进展.

避免事务饿死: 当事务T申请对数据项加M型锁时, 并发控制管理器授权加锁的条件是:

  1. 不存在在数据项上持有与M型锁冲突的锁的其他事务;
  2. 不存在等待对数据项加锁且先于事务T申请加锁的事务.

因此一个加锁请求就不会被其后的加锁申请阻塞.

封锁协议

封锁协议(locking protocol): 规定事务何时对数据进行加锁 解锁. 封锁协议限制了可能的调度数目. 这些调度组成的集合是所有可能的可串行化调度的一个真子集.

两阶段封锁协议(two-phase locking protocol)

此协议用于保证可串行性. 要求事务分两个阶段提出加锁和解锁申请.

  1. 增长阶段(growing phase): 事务可以获得锁,但不能释放锁.
  2. 缩减阶段(shrinking phase): 事务可以释放锁, 但不能获得新锁.

最初, 事务处于增长阶段, 事务根据需要获得锁.一旦事务释放了锁,就进入了缩减阶段,并且不能再发出加锁请求.

引用

详解 MySql InnoDB 中意向锁的作用

上一篇 下一篇

猜你喜欢

热点阅读