Innodb中常见SQL语句设置的锁类型

  • 时间:
  • 浏览:1

RR及其以上隔离级别下,该说说会加next-key锁;在RC级别,只加record锁。

但会 对于唯一列(unique列和主键列),将会多个事务向同一行插入数据,没有 第有有三个小事务持有该行的X锁,要是的事务将向你这一 重复的索引记录行上请求加S锁,但会 此时趋于稳定锁守候大什么的问题。你这一 要是,还有将会会有死锁趋于稳定:

RR及其以上隔离级别下,该说说会加next-key锁;在RC级别,只加record锁。

会话2上开启事务2,执行如下操作:

除了serializable隔离级别,你这一 SQL还要一致性非锁定读,不加锁;在serializable级别,你这一 SQL加next-key锁。

这类假设有个如下特征的innodb表:

假设有有有三个小会话依次执行如下操作:

你这一 SQL加S类型的next-key锁。这类,在会话1上开启事务1,执行如下操作(num列上建有普通二级索引):

你这一 SQL在T表被插入的行再加X record lock;在S表上,若事务隔离级别还要SERIALIZABLE,innodb在S表上是一致性非锁定读依据(即不加锁)。将会是在SERIALIZABLE级别,innodb将在S表再加S类型的next-key锁。

插入num=8和31,都趋于稳定阻塞,说明事务1执行的说说产生了间隙锁。若再在事务2中执行说说“select * from lock_test where num=12 lock in share mode;”,不让趋于稳定阻塞,说明num=12再加的是S锁,有些锁兼容。

包括lock tables tb_name read/write说说,你这一 说说加的是表锁(table locks),设置表锁的是innodb层之上的MySQL server层

该SQL与simple insert的不同之趋于稳定于,当趋于稳定重复键错误时,在要更新的行上设置X类型的next-key锁

你这一 SQL加X类型的next-key锁。

加锁依据和insert … select依据相同。

会话1获得i=1数据行上的X锁,过过后 话2和会话3的操作将会将会会愿因重复键错误,有些它们均请求i=1上的S锁而趋于稳定锁守候;当会话1回滚后,i=1数据行上的X锁被释放(将会说没有 了i=1的行),此时锁请求队列里的会话2和会话3都还还要获得S锁,但此时将产生死锁:将会它们都持有该数据行上的S锁,但会 有有三个小会话都获取不都并能数据行上的X锁。

顶端的例子,将会i是unique key,状况也同样适用。

这里指简单的insert(simple insert),即不加ON DUPLICATE KEY UPDATE和select子句的insert说说。你这一 SQL说说只会在它插入的行再加X锁,而不让加next-key锁。