mysql控制间隙锁的参数是:

:innodb_locks_unsafe_for_binlog,

这个参数默认值是OFF, 也就是启用间隙锁, 他是一个bool值, 当值为true时表示disable间隙锁

间隙锁的出现主要集中在同一个事务中先delete后 insert的情况下,当我们通过一个参数去删除一条记录的时候,

如果参数在数据库中存在,那么这个时候产生的是普通行锁,锁住这个记录, 然后删除, 然后释放锁。(正常情况)

如果这条记录不存在(非正常情况),问题就来了, 数据库会扫描索引,发现这个记录不存在, 这个时候的delete语句获取到的就是一个间隙锁,

然后数据库会向左扫描扫到第一个比给定参数小的值,向右扫描扫描到第一个比给定参数大的值, 然后以此为界,

构建一个区间, 锁住整个区间内的数据, 一个特别容易出现死锁的间隙锁诞生了。

所以间隙锁 产生于 删除不存在的数据的时候.

在Mysql中, 事务最终都是穿行执行, 但是在高并发的情况下,

执行的顺序就极有可能发生改变, 变成下面这个样子:

>>> delete from testLock where id = ‘6’;

>>> insert into testLock(id,name) values(‘6’, ‘hahaha’);

这个时候最后一条语句:insert into testLock(id,name) values(‘6’, ‘hahaha’); 执行时就会爆出死锁错误。因为删除id = 6这条记录的时候,

id为6之后的部分都被锁住了, 他们都取得了这一个数据段的共享锁, 所以在获取这个数据段的排它锁时出现死锁。

这种问题的解决办法:前面说了, 通过修改数据库的参数innodb_locaks_unsafe_for_binlog来取消间隙锁从而达到避免

这种情况的死锁的方式尚待商量, 那就只有修改代码逻辑, 存在才删除,尽量不去删除不存在的记录。

mysql 间隙锁 给我们写业务逻辑的提示:

1.删除之前,先查询是否存在. 如果并发不大,内部系统,可以不考虑

2. 不做物理删除, 而做逻辑删除 或者 就 修改.

mysql 如何避免间隙锁_mysql 间隙锁相关推荐

  1. mysql 全局锁_Mysql全局锁和表级锁

    以前对Mysql的锁的认识,只了解表锁和行锁,其实Mysql的锁的种类还是不少的,有全局锁,表级锁,行级锁,还有元数据锁,间隙锁,临界锁. 一 全局锁 Mysql的全局锁是对整个实例加锁,加锁之后,数 ...

  2. mysql mdl 锁_MySQL MDL锁

    MDL全称为metadata lock,即元数据锁.MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务(显式或隐式)的时候,不可以对元数据进行写入操作.因此从MySQL5.5版本开始引入了M ...

  3. mysql proxy 悲观锁_mysql悲观锁总结和实践

    使用场景举例:以MySQL InnoDB为例 商品t_goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单时必须确保该商品 ...

  4. mysql全局读写怎么锁_MySQL全局锁和表锁

    最近正好在看操作系统中关于线程,锁的部分,也可以学习一下数据库种的锁. MySQL的锁分为全局锁,表级锁,行锁三类. 全局锁 名思义,全局锁就是对整个数据库实例加锁.MySQL提供了一个加全局读锁的方 ...

  5. mysql实现悲观锁_mysql 悲观锁详解

    悲观锁指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层 ...

  6. mysql如何加悲观锁_MySQL悲观锁

    悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制( ...

  7. mysql默认使用悲观锁_mysql乐观锁和悲观锁详解

    mysql乐观锁和悲观锁详解 相信很多朋友在面试的时候,都会被问到乐观锁和悲观锁的问题,如果不清楚其概念和用法的情况下,相信很多朋友都会感觉很懵逼,那么面试的结果也就不言而喻了. 那么乐观锁和悲观锁到 ...

  8. mysql如何使用乐观锁_mysql 乐观锁和悲观锁

    数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的 ...

  9. mysql innodb默认的锁_Mysql InnoDB锁

    MySQL 不同引擎的锁机制: MyISAM和MEMORY采用表级锁(table-level locking) BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁 InnoD ...

  10. mysql 事务排他锁_mysql排他锁

    1.排他锁示范: 排他锁:x锁,加完排他锁,事务不释放或者不提交,其他事务无法进行对应数据的操作(其他事务无法拿到对应的排他锁) -- 新建一个连接 select @@autocommit; set ...

最新文章

  1. HDUOJ----1166敌兵布阵(线段树单点更新)
  2. 现阶段的微信小程序能实现直播功能么?
  3. php array_merge内存不够,php array_merge函数使用需要注意的一个问题
  4. 无障碍开发(五)之设置获取无障碍属性值
  5. ESXi 功能 (看到的觉得有用就发出来了)
  6. 19年8月 字母哥 第四章 常用web开发数据库框架 不要用公司网络加载不出来 用热点!!!
  7. django博客项目7
  8. java json 嵌套解析_我们如何解析Java中的嵌套JSON对象?
  9. Crystal Ball 图标进入EXCEL后却没加载 Crystal Ball
  10. 8uftp工具,这款工具有什么作用?它的优势在哪里?
  11. 博弈论算法常见模型整理
  12. 初级会计资格-初级会计实务-知识点总结大全
  13. AutoCAD 安装
  14. 肝了一夜,用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换...
  15. MTK6589平板上launcher的一些小修改
  16. mysql中一个字符等于几个字节_细说一个汉字等于几个字符,以及汉字,字符,字节,位之间的关系...
  17. 如何学习游戏服务器端编程和书籍推荐
  18. SpringBoot整合RabbitMQ之整合配置篇
  19. 保险资管需求多元化 壹资管平台赋能行业智能化转型
  20. VBA宏将带分隔符txt文件另存为xls格式

热门文章

  1. 二值图像游程matlab,二值图像游程编码matlab代码.doc
  2. xftp6成功安装教程(踩坑系列)
  3. 记一次结合fiddler逆向破解app注册码
  4. Anaconda python版本降级
  5. SQLAlchemy学习-1.环境准备与基础使用
  6. java 打印request的原始请求数据
  7. ansys计算机热仿真,[计算机软件及应用]ansys热分析教程.ppt
  8. IP模拟工具modify header
  9. 实验高中计算机,仿真物理实验室高中完整版
  10. matlab2016以上进行多体动力学不能用joint actuator驱动旋转关节,要用simulink-PS converter