MySQL InnoDB Lock Modes

  • 时间:
  • 浏览:15

有一种锁之间的兼容性如下:

注意:

机会InnoDB监视器输出的最新检测到的死锁次责含高 如下输出信息:

会话2上开启事务T2:

所以,引入意图锁的目的所以为了支持多粒度锁定,才能通过意图锁显示事务锁定了表中的但会 行,机会将要锁定表中的但会 行。

居于死锁的3个必要条件:

互斥条件

不可剥夺

请求与保持

循环等待英文

这时再看会话2的事务T2,会输出如下信息:

会话1的事务T1再执行操作:

死锁演示:

会话1上开启事务T1:

意图锁是表锁,它指示事务稍后将在表数据行添加何种类型的锁。IS锁表示事务稍都在在数据行添加S锁,IX锁表示事务稍都在在数据行添加X锁。常见的,像“select … lock in share mode”句子会加IS锁,“select … for update”句子会加IX锁。

说明:

另一方认为,后边的S和X锁是表级别的S和X锁。但刚刚和亲戚我们讨论,说这样表级别的S和X锁,不到行级别的S和X锁,并后边指的是行级别的S和X锁。刚刚发现在姜承尧的innodb内幕这本书中,也提到后边指的是行级别的S和X锁。

但会 我但会 疑惑的所以:锁的粒度不同,怎么才能 才能 讨论兼容性?更何况意图锁引入的目的所以为了支持mysql的多粒度锁定。

意图锁的协议如下:

一3个事务要想获得行上的S锁,都要先获取该表上的IS机会更强的锁;

一3个事务要想获得行上的X锁,都要先获取该表上的IX锁。

机会事务请求的锁与现有锁兼容,则授予该事务锁;但机会与现有锁冲突,则不授予该事务锁,事务都要等待英文现有锁被释放后才能获取锁。

Innodb支持多粒度锁,即允许记录锁(record locks)和表锁共存(InnoDB supports multiple granularity locking which permits coexistence of record locks and locks on entire tables)。为了在多个粒度级别上实现锁定,innodb引进了意向锁。有有一种意向锁:

Intention shared(IS):意向共享锁,表示事务T将要对表中数据行加S锁,而先在表级别添加的所以IS锁;

Intention exclusive(IX):意向排它锁,表示事务T将要对表中数据行加X锁,而先在表级别添加的所以IX锁;

Innodb实施标准的行级锁,其含高 晒 一种类型的锁:

Shared lock即共享锁,S锁。机会事务对数据行r持有S锁,这样允许其它事务对数据行r持有S锁,但不允许其它事务对数据行持有X锁。

Exclusive lock即排它锁,X锁。机会事务T1对数据行r持有X锁,这样就不允许其它事务对数据行持有S锁或X锁,除非等到T1释放r上的X锁

这表明锁等待英文列表上的事务数量机会达到了200个的限制,超过200个事务的等待英文列表被视为死锁,但会 数量限制和参数LOCK_MAX_DEPTH_IN_DEADLOCK_CHECK有关