首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL 案例:Update 死锁详解

死锁的两个语句如下: UPDATE tbl_deadlock SET col1 = 1, col2 = 1, update_time = 1603685523 WHERE (id1 = 6247476)...MySQL 不触发死锁回滚,且未进入 lockwait_timeout 的时候,具备这个条件。 不剥夺条件:已获得的资源,在末使用完之前,不能强行剥夺。 MySQL 的锁机制天然具备这个条件。...由于 MySQL 的锁机制的原因,只需要判断出两个 SQL 语句的锁存在循环等待,那么死锁的条件就会成立了。...用户提出的疑问:使用的也是不同的索引,为什么会发送死锁?实际上二级索引上的记录锁,最终也会加到主键上。...因此本案例中,虽然死锁信息中记录的索引名称不一样,但是锁争用的条件是成立的,即:trx1 通过二级索引向主键上执行了加锁操作,而 trx2 在其他的二级索引上拿到了锁,但是主键锁拿不到,因此进入了等待状态

15.2K174

MySQL 使用 for update 引发死锁原因分析

在之前的一次开发需求中使用了 for update 实现悲观锁,最后导致出现了很多的 MySQL 死锁报警,现记录下死锁产生的原因。...但是后来发现这个修改逻辑造成 MySQL 死锁。...死锁原因分析造成死锁的原因主要和 for update 对数据加锁的过程有些关系,加锁过程描述:MySQL innodb 存储引擎默认的隔离级别时 RR 级别,而RR隔离级别,默认是使用Next-key...间隙锁只影响一般索引,对于唯一索引或者主键,如果查询的结果包含这个记录,那么另外的会话插入该记录前后,不会产生间隙锁;如果查询结果不包含这个记录,另外的会话插入该记录前后的间隙,会产生间隙锁。...,并对这部分数据进行修改时就会出现死锁的情况参考文章MySQL 锁类型总结MySQL 间隙锁,锁过程详解

1.3K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    mysql insert duplicate key update 死锁分析

    背景 数据入库这块有离线和实时两套入库系统,写同一个db的同一批mysql表,两边用的都是insert into table on duplicate key update这种方式。...原因分析&解决方案 这里面分两种情况,一种是带主键的insert duplicate key update,一种是没有主键带唯一索引的insert duplicate key update。...1、带主键的insert duplicate key update 实时入库的batch大小是1w,离线入库的batch大小也是1w,为了提高入库效率 ,两边都开启了事务。...解决方案: 1、减少batch的大小,单个事务获取到的next-key锁的范围就会变少,减少死锁的概率。 2、重试。 3、插入数据时添加主键。...如果插入数据时带上主键,那么就不会产生next-key锁,会退化到第一种情况(带主键的insert duplicate key update)。

    4.3K11

    MySQL RC模式insert update 可能死锁的情况

    涉及的语句为 RC模式下 update根据主键更新和insert 其实这样的问题在RC模式下,要么是简单update问题,要么是insert造成的主键和唯一键检查唯一性时出现问题。...下面以主键问题为列子进行分析一下可能出现的情况。...update  where条件更新为主键,锁结构出现在单行主键上,辅助索引包含隐含锁结构,当前读RC非唯一索引模式没有GAP锁, insert  插入印象锁,主键和辅助索引上会出现隐含锁结构, 但是在RC...testlll set name='gaopeng1' where id=24;(堵塞) 死锁 锁结构: ---TRANSACTION 322809, ACTIVE 30 sec starting...update testlll set name='gaopeng1' where id=22;(堵塞) 死锁 这种情况比较简单不打印出锁结构 情况3 insert insert TX1:

    1.1K21

    mysql 联合主键_Mysql 创建联合主键

    Mysql 创建联合主键 2008年01月11日 星期五 下午 5:21 使用primary key (fieldlist) 比如: create table mytable ( aa int, bb...char(8), cc date, primary key (aa,bb ) ); aa,bb为联合主键 不知道是不是因为mysql(6.0)的版本问题,还是各版本都是这种情况,mysql中创建联合主键...TABLE t1( id … MySQL创建双主键 如下: CREATE TABLE `loginlog` ( `id` ) unsigned zerofill NOT NULL AUTO_INCREMENT...COMMENT ‘主键编号’, `IP` … mysql修改联合主键 参考 https://blog.csdn.net/BockSong/article/details/80933477 alter...涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A … SQL Server中的联合主键、聚集索引、非聚集索引、mysql

    8.3K20

    MySql 死锁

    死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务视图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源,也会产生死锁。...UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = '2002-05-02'; UPDATE StockPrice SET...,接着每个事务都尝试去执行第二条UPDATE语句,却发现该行已经被对方锁定,然后那个事务都等待对方释放锁,同时又持有对方需要的锁,则陷入死循环。...除非有外部因素介入才可能解除死锁。 死锁发生以后,只有部分或者完全回滚其中一个事务,才能打破死锁。对于事务型的系统,这是无法避免的,所以应用程序在设计时必须考虑如何处理死锁。...大多数情况下只需要重新执行因死锁回滚的事务即可。

    1.3K10

    mysql 主键自增语句_MySQL 自增主键

    自增主键的单调性 为何会有单调性的问题? 这主要跟自增主键最大值的获取方式,以及存放位置有关系。 如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删除而减小。...自增主键最大值怎么取的?存放到哪里?...MySQL 5.7 及之前的版本,自增主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算的...从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里的值。...参考文档 为什么 MySQL 的自增主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

    10.8K10

    讲讲insert on duplicate key update 的死锁坑

    当然如果你对锁不是很熟悉的话你可以先看我的这两篇文章看一下数据库锁的基础知识: 为什么开发人员必须要了解数据库锁:和记一次神器的mysql死锁排查 2.问题分析 数据库代码如下: CREATE TABLE...之前没有遇到过insert出死锁的情况,所以当时觉得是on dpulicate key update导致的。...一般的死锁日志都是由两个事务导致的,所以会给予一定的迷惑性,其实大部分的死锁都是由两个以上的事务导致的,这次其实也不例外,这其实是mysql的一个bug,https://bugs.mysql.com/bug.php...在 https://bugs.mysql.com/bug.php?...我们最后使用的就是这个方法,因为ON DUPLICATE KEY UPDATE 这个在代码中的确是没有必要 在数据库表中只建立主键,不建立其他唯一索引。

    22.1K41

    Mysql资料 主键

    表中的任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同的主键值 2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为...: 1、不更新主键列的值 2、不重用主键列的值 3、不在主键列中使用可能会更改的值(例如,如果使用一个名字作为主键以标识某个供应商,应该供应商合并和更改其名字时,必须更改这个主键) 总之:不应该使用一个具有意义的...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15...2、.如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置: 此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键。 mysql 在频繁的更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低。

    3.8K20

    Mysql Innodb 锁机制 select * from table where?insert?delete?update?3个insert的死锁2个update的死锁3个以上delete的死

    ,对主键加锁, 加锁的数据行数会受到Mysql是否支持Index Condition PushDown而影响(Mysql 5.6支持ICP),加锁的数量可能远远大于满足条件的记录数量 这里需要加两次锁的原因是...2个update的死锁 事务A 事务B begin; begin; update deadlocktest force index(I_b) set e = sleep(5) where b>0;...; try restarting transaction Rows matched: 4  Changed: 4  Warnings: 0 两个update事务,加锁顺序不一样导致的死锁 InnoDb...的行锁是对索引加锁的,对扫描的行边扫描边加锁,如果走的是二级索引(非聚簇索引)除了需要对二级索引加锁外,还需要根据二级索引里面的主键信息扫描主键的聚簇索引,对主键加锁 3个以上delete的死锁 事务A...3个delete的死锁比较难以复现,我是利用如下脚本完成的 MY_DB="mysql -hxxx -Pxxx -uxxx -pxxx" while : do echo "use test;begin;

    1.6K80

    Mysql查询语句使用select.. for update导致的数据库死锁分析

    如果要求更智能,oracle支持for update skip locked跳过锁区域,这样能不等待马上查询没有被锁住的下一个30条记录。 下面说下mysql for update导致的死锁。...经过分析,mysql的innodb存储引擎实务锁虽然是锁行,但它内部是锁索引的,根据where条件和select的值是否只有主键或非主键索引来判断怎么锁,比如只有主键,则锁主键索引,如果只有非主键,则锁非主键索引...但同样的select .. for update语句怎么就死锁了呢?...同样的sql语句查询条件和结果顺序都一致,按理不会导致一个锁了主键索引,等待锁非主键索引,另外一个锁了非主键索引,等待主键索引导致的死锁。...我们项目出现死锁,就是这个原理,一条sql语句先锁主键索引,再锁非主键索引;另外一条sql语句先锁非主键索引,再锁主键索引。

    3.8K10

    mysql主键自增策略_MySQL 自增主键机制

    自增主键:特指在自增列上定义的主键。 自增主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。 1. 自增值保存在哪? 不同的存储引擎保存自增值的策略不一样; a....Innodb引擎,mysql5.7之前,自增值保存在内存中,而且不会持久化自增值。...每次重启后第一次打开表,都会去查找自增值的最大值max(id), 并设置表当前自增值为max(id) + 1; mysql8.0, 自增值变更记录在了redo log中,重启时依靠redo log恢复重启之前的值...为了减少自增id锁带来的性能影响,mysql不会修改回去之前的自增值; 4. 自增锁的优化 a....而对于批量插入数据的语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请自增 id 的策略(注:该策略是导致自增 id 不连续的第三种原因

    9.5K50

    MySQL的主键详解

    表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观的看到某个重复字段的记录条数 主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。...联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样

    5K20

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券