mysql间隙锁与隔离级别 mysql间隙锁如何使用

[转帖]mysql常用存储引擎(InnoDB、MyISAM、MEMORY、MERGE、ARCHIVE)介绍...MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用 。
非事务安全表:MyISAM、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等MySQL默认的存储引擎是MyISAM(7版本中默认为InnoDB) 。配置文件中设置默认存储引擎的参数:default-table-type 。
InnoDB存储引擎:InnoDB是MySQL的默认存储引擎,它提供了事务支持、行级锁定和外键约束等功能 。InnoDB适合于需要事务支持和复杂查询的应用程序 。
下面是常用存储引擎的适用环境:MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一InnoDB:用于事务处理应用程序 , 具有众多特性,包括ACID事务支持 。
记录锁、间隙锁、临键锁这三种并不是锁,而是锁的算法 。它们的共同特点是互斥的 。间隙锁和临键锁只有在RR级别中才能生效 。
间隙锁Gap lock , 锁定索引记录间隙(不含该记录) , 确保索引记录间隙不变,防止其他事物在这个间隙进行insert操作 , 产生幻读,在RR隔离级别下都支持 。
如上表如示,是基于没有间隙锁的假设,sessionA 事务内执行两次相同的当前读返回的数据不一样,出现幻读的现象 。因为(2 , 2,10)这条记录在原本的数据并不存在,行锁就锁不住,因此诞生间隙锁 。
索引本身以及索引之前的间隙 。临键锁要右闭区间的原因是索引本身以及索引之前的间隙 。临键锁可以理解为锁住的是索引本身以及索引之前的间隙,是一个左开右闭的区间 。
案例一:等值查询间隙锁 案例二:非唯一索引等值锁 根据原则1,优化2,锁的范围是(0 , 5],(5,10) , 但是根据原则2,只有访问到的对象才加锁,这个查询使用了覆盖索引,并不访问主键索引,所以主键上没加锁 。
【mysql间隙锁与隔离级别 mysql间隙锁如何使用】让我回顾一下gap lock的定义: 间隙锁,锁定一个范围,但不包括记录本身 。
mysql死锁场景整理mysql数据库死锁解决方法如下:对于按钮等控件,点击后使其立刻失效 , 不让用户重复点击,避免对同时对同一条记录操作 。使用乐观锁进行控制 。乐观锁大多是基于数据版本(Version)记录机制实现 。
MySQL有两种死锁处理方式:等待 , 直到超时(innodb_lock_wait_timeout=50s) 。发起死锁检测,主动回滚一条事务,让其他事务继续执行(innodb_deadlock_detect=on) 。由于性能原因,一般都是使用死锁检测来进行处理死锁 。
gap lock 导致了并发处理的死锁 在mysql默认的事务隔离级别(repeatable read)下,无法避免这种情况 。只能把并发处理改成同步处理 。或者从业务层面做处理 。
程序中应有事务失败检测及自动重复提交机制 。高并发(秒杀)场景中 , 关闭innodb_deadlock_detect选项,降低死锁检测开销,提高并发效率 。生产环境MySQL死锁如何监控及如何减少死锁发生的概率 。
mysql:间隙锁的概念意向锁(Intention Locks; table-level lock) 意向锁是一种特殊的表级锁,意向锁是为了让 InnoDB 多粒度的锁能共存而设计的 。
间隙锁Gap lock,锁定索引记录间隙(不含该记录) , 确保索引记录间隙不变,防止其他事物在这个间隙进行insert操作,产生幻读 , 在RR隔离级别下都支持 。
间隙锁的产生来自于 InnboDB 引擎在可重复读的级别基础上执行当前读时出现的幻读问题 。
对于数据范围内存在间隙的,需要根据隔离级别确认是否对间隙加锁 。默认的 REPEATABLE READ 隔离级别,为了保证可重复读 , 除了对数据本身加锁以外,还需要对数据间隙加锁 。

    推荐阅读