MVCC和加锁是解决并发事务带来的一致性问题的两种方式。
共享锁简称为S锁,独占锁简称为X锁。S锁与S锁兼容;X锁与S锁不兼容,与X锁也不兼容。
事务利用MVCC进行的读取操作成为一致性读,在读取记录前加锁的读取操作称为锁定读。
InnoDB有两种语法来进行锁定读:
select..lock in share mode语句为读取的记录加S锁;
select..for update语句为读取的记录加X锁。
INSERT语句一般情况下不需要在内存中生成锁结构,并单纯依靠隐式锁保护插入的记录。
UPDATE和DELETE语句在执行的过程中,在B+树中定位到待改动记录并给该记录加锁的过程也算是一个锁定读。
IS,IX锁是表级锁,它们的提出仅仅为了在之后加表级别的S锁和X锁时,可以快速判断表中的记录是否被上锁,以避免用遍历的方式来查看表中有没有上锁的记录。
InnoDB中的行级锁类型有下面这些类型:
1.Record Lock:被我们戏称为正经记录锁,只对记录本身加锁。
2.Gap Lock:锁住记录前的间隙,防止别的事务向该间隙插入新纪录。
3.Next-Key Lock: record lock和gap lock的结合体,既保护记录本身,也防止别的事务向该间隙插入新纪录。
4.Insert Intention Lock: 是为了解决“在当前事务插入记录时因碰到别的事务加的gap锁而进入等待状态,也生成一个锁结构”而提出的。
隐式锁:依靠记录的trx_id属性来保护不被别的事务改动该记录。
InnoDB存储引擎的锁在内存中对应着一个锁结构。有时为了节省锁结构,会把符合下面条件的锁放到同一个 锁结构中:
1.在同一事务中进行加锁操作。
2.被加锁的记录在同一页面中。
3.加锁的类型是一样的。
4.等待状态是一样的。
语句加锁的情况受到所在事务的隔离级别,语句执行时使用的索引类型,是否是精确匹配,是否是唯一性搜索,具体执行的语句类型等情况的制约。
可以通过information_schema数据库下的INNODB_TRX,INNODB_LOCKS,INNODB_WAITS表来查看事务和锁的 相关信息,
也可以通过SHOW ENGINE INNODB STATUS语句查看事务和锁的相关信息。
不同事务由于互相持有对方需要的锁而导致事务都无法继续执行的情况称为死锁。死锁发生时,InnoDB会选择一个较小的事务进行回滚。
可以通过查看死锁日志来分析死锁发生过程。
标签:总结,知识点,事务,加锁,读取,记录,语句,死锁,MySQL From: https://www.cnblogs.com/huwy-123/p/17616341.html