`

关于业务服务的SQL死锁分析

 
阅读更多

 

    背景:

      最近在做数据库迁移,为了评估新库的性能,我们找性能测试的同事压测了接口。压测完后发现一个接口频繁出现死锁的问题。这个接口是添加地址,一般的添加地址直接insert就好了,但是压测的场景是新添加的这个地址是默认的地址,这个逻辑会相对复杂。主要有两步,第一步更新默认地址为非默认地址,第二部新加默认地址。隔离级别Read Repeatable 存储引擎:innodb。SQL如下:

      

-- 更新为非默认地址
update contact set default_flag = 0 where user_id = xx

-- 插入默认地址
insert into contact values(xx,xxx)

CREATE TABLE `contact` (
  `id` bigint(20) NOT NULL COMMENT '用户信息表id',
  `user_id` bigint(20) NOT NULL COMMENT '用户id',
  `user_name` varchar(64) NOT NULL COMMENT '用户名',
  `name` varchar(64) DEFAULT NULL COMMENT '姓名',
  `use_num` bigint(10) DEFAULT NULL COMMENT '使用次数',
  `province_name` varchar(50) DEFAULT NULL COMMENT '省名称',
  `city_name` varchar(50) DEFAULT NULL COMMENT '市名称',
  `district_name` varchar(50) DEFAULT NULL COMMENT '区名称',
  `id_num_vflag` tinyint(4) DEFAULT '0' COMMENT '身份证号码是否已验证',
  `mobile_enc` varchar(128) DEFAULT NULL COMMENT '电话加密',
  PRIMARY KEY (`id`),
  KEY `idx_uid_unum_utime` (`user_id`,`use_num`,`update_time`),
  KEY `idx_utime_unum` (`update_time`,`use_num`)
) ENGINE=InnoDB ;

    请思考为啥会报死锁呢?

 

    背景技术:

      InnoDB的行锁实现类别

       1: 行锁(注意锁的是索引)

       2: gap 区间锁(这个是实现read repeatable的基础,有了区间锁就能保证不会有数据在区间插入删除,所以事务内每次范围查询的sql的值总是相等。read uncommited 会有脏读,读到没提交的数据。 read commited导致幻读,事务内两次读取的数据不一致。 read repeatable 又做了升级,事务内读取的数据一致,所以叫可重复读。)

       3: 行锁+ gap 锁

 

    死锁原因:

 
      

    

 

  

      事务一的SQL1: 执行过程中使用了gap锁和三个行锁

      事务二的SQL1: 执行过程中使用了gap锁和等待行锁

      事务一的SQL2: 需要等待事务二的gap锁释放

      事务二: SQL1需要等待事务一的行锁释放

 

    解决方式:

    1. 先查询出默认地址

    2. 根据第一步的默认地址的id来更新默认地址为非默认地址

    3. 做insert操作

    为何第2不没有gap锁,因为是根据主键进行更新,主键的范围就是一个值,中间根本可能插入任何数据,唯一键也是这个效果。

 

    SQL:如下

-- 查询默认地址
select xx from contact where default_flag = 1 and user_id =xx

-- 更新为非默认地址
update contact set default_flag = 0 where id = xx

-- 插入默认地址
insert into contact values(xx,xxx)

    

 

  • 大小: 6.5 KB
分享到:
评论

相关推荐

    pt-osc在线重建表导致死锁的分析及对应的优化方案1

    0.背景在业务低峰通过pt-osc在线做DDL期间出现死锁,导致业务的SQL被回滚了,对应用不友好。本案例死锁发生的场景:pt-osc拷贝最后一个chunk-s

    关于MySQL死锁问题的深入分析

    其实如果大家认真研读了我们之前写的3篇关于MySQL中语句加锁分析的文章,加上本篇关于死锁日志的分析,那么解决死锁问题应该也不是那么摸不着头脑的事情了。 准备工作 为了故事的顺利发展,我们需要建一个表: ...

    收集一些常见的 MySQL 死锁案例

    实际上,我们在定位死锁问题时,不仅应该对死锁日志进行分析,还应该结合具体的业务代码,或者根据 binlog,理出每个事务执行的 SQL 语句。 我将这些死锁按事务执行的语句和正在等待或已持有的锁进行分类汇总: 表...

    SQLServer2008查询性能优化 2/2

    第3章 SQL查询性能分析 58 3.1 SQL Profiler工具 58 3.1.1 Profiler跟踪 59 3.1.2 事件 60 3.1.3 数据列 62 3.1.4 过滤器 64 3.1.5 跟踪模板 65 3.1.6 跟踪数据 65 3.2 跟踪的自动化 66 3.2.1 使用GUI捕捉...

    SQLServer2008查询性能优化 1/2

    第3章 SQL查询性能分析 58 3.1 SQL Profiler工具 58 3.1.1 Profiler跟踪 59 3.1.2 事件 60 3.1.3 数据列 62 3.1.4 过滤器 64 3.1.5 跟踪模板 65 3.1.6 跟踪数据 65 3.2 跟踪的自动化 66 3.2.1 使用GUI捕捉...

    SQL Server 2008高级程序设计 4/6

     2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  2.7 BulkCopy Program(bcp)  2.8 SQL Server Profiler  2.9 sqlcmd  2.10 小结 第3章 提出更好的问题:高级查询  3.1 子查询概述  3.2 ...

    SQL查询安全性及性能优化

    死锁,当不同用户都访问某些资源的时候SQL语句不当导致死锁 客户失去信心,软件失败 低效SQL低效在哪里?  性能低下的根源  硬件原因,数据库的配置不合理,数据库的数据文件和日志文件没有分磁盘存放,会极...

    SQL Server 2008高级程序设计 2/6

     2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  2.7 BulkCopy Program(bcp)  2.8 SQL Server Profiler  2.9 sqlcmd  2.10 小结 第3章 提出更好的问题:高级查询  3.1 子查询概述  3.2 ...

    一次离奇的 MySQL 死锁分析

    业务场景是:归档一个表里边的数据到历史表里边,同是删除主表记录。  2、背景场景简化如下(数据库引擎InnoDb,数据隔离级别RR[REPEATABLE]) — 创建表test1 CREATE TABLE test1 ( id int(11) NOT NULL AUTO_...

    Mysql 数据库死锁过程分析(select for update)

    解决同时拿数据的方法有很多,为了更加简单,不增加其他表和服务的情况下,我们考虑采用select… for update的方式,这样X锁锁住查询的数据段,表里其他数据没有锁,其他业务逻辑还是可以操作。 这样一台服务器比如...

    SQL Server 2008高级程序设计 5/6

     2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  2.7 BulkCopy Program(bcp)  2.8 SQL Server Profiler  2.9 sqlcmd  2.10 小结 第3章 提出更好的问题:高级查询  3.1 子查询概述  3.2 ...

    SQL Server 2008高级程序设计 6/6

     2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  2.7 BulkCopy Program(bcp)  2.8 SQL Server Profiler  2.9 sqlcmd  2.10 小结 第3章 提出更好的问题:高级查询  3.1 子查询概述  3.2 ...

    SQL Server 2008高级程序设计 1/6

     2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  2.7 BulkCopy Program(bcp)  2.8 SQL Server Profiler  2.9 sqlcmd  2.10 小结 第3章 提出更好的问题:高级查询  3.1 子查询概述  3.2 ...

    SQL Server 2008高级程序设计 3/6

     2.5 SQL Server集成服务(SSIS)  2.6 Reporting Services  2.7 BulkCopy Program(bcp)  2.8 SQL Server Profiler  2.9 sqlcmd  2.10 小结 第3章 提出更好的问题:高级查询  3.1 子查询概述  3.2 ...

    sqlcore数据库防注入分析系统

    3.平台的监控和业务逻辑的分析 4.数据库防止死锁的分析 。。。。。。。。。。。。。。。。。。。 如何配置使用 1.系统需要正确的安装jdk和mysql数据,这个自己网上看看如何弄 2.配置jdbc的数据库连接 到这个文件...

    MySQL数据库的一次死锁实例分析

    业务场景是:归档一个表里边的数据到历史表里边,同是删除主表记录。 2、背景场景简化如下(数据库引擎InnoDb,数据隔离级别RR[REPEATABLE]) -- 创建表test1 CREATE TABLE test1 ( id int(11) NOT NULL AUTO_...

    数据库服务器(全文).doc

    当网络性能 急剧下降的时候,可以通过嗅探器分析网络流量,找出网络阻塞的来源。网络嗅探是网 络监控系统的实现基础。 任何东西都有它的两面性,在黑客的手中,嗅探器就变成了一个黑客利器。 链接:暴力破解 穷举法...

    10道精选MySQL面试题

    如何通过EXPLAIN分析SQL语句的执行计划? 描述一下MySQL事务的ACID特性,并举例说明每种特性的实际应用场景。 解释不同事务隔离级别的含义以及可能导致的问题(脏读、不可重复读、幻读),并指出MySQL的默认隔离级别...

    Oracle优化日记:一个金牌DBA的故事 白鳝.扫描版

    Oracle的死锁优化小技巧 几个常用的与锁相关的脚本5月20日 凌晨的邮件通知短信今日点评优化小技巧 /10028事件优化小技巧 PL/SQL 优化工具profiler5月22日 ODS系统和RAC优化小技巧 以开放的心态做服务优化小技巧 ...

Global site tag (gtag.js) - Google Analytics