`

关于业务服务的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
分享到:
评论

相关推荐

    sql数据库死锁查询工具

    SQL死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,它们都将无法继续执行。这种情况通常发生在以下场景:事务A持有资源X并请求资源Y,同时事务B持有资源Y并请求资源X,...

    SQLServer排查死锁

    ### SQL Server 死锁排查与解决方法 #### 一、SQL Server Profiler 监控数据库死锁 在处理SQL Server数据库中的死锁问题时,一个非常实用的工具就是SQL Server Profiler。它可以帮助我们捕捉到数据库运行过程中的...

    sqlserver死锁处理

    死锁不仅会降低系统的整体性能,还可能导致数据处理异常中断,严重影响业务运行。因此,了解并掌握 SQL Server 死锁的处理方法对于 DBA 和开发人员来说至关重要。 #### 二、死锁检测与处理 本节将详细介绍如何检测...

    db2死锁问题分析及解决方案

    ### DB2死锁问题分析及解决方案 #### 一、引言 在数据库管理与维护过程中,死锁问题是一个常见的挑战,特别是在使用IBM DB2这样的大型关系型数据库管理系统时。本文将详细探讨DB2中死锁问题的分析方法及有效的解决...

    Sql Server 死锁的监控分析解决思路

    2. **死锁分析** 当发生死锁时,SQL Server会生成一个XML死锁图,如描述中所示,包含在报警信息中。这个XML提供了死锁涉及的所有资源和事务的详细信息。分析XML可以帮助我们理解死锁的具体原因。例如,通过分析`...

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

    在进行数据库维护时,特别是在业务低峰期使用像pt-online-schema-change(pt-osc)这样的工具进行在线DDL操作时,可能会遇到死锁问题,这可能导致业务SQL被回滚,从而影响应用的正常运行。本文将深入探讨pt-osc的...

    浅析SQL SERVER死锁产生的原因及解决 (1).pdf

    4. 死锁分析工具:使用SQL Server提供的系统存储过程sp_who, sp_lock, sp_spaceused等来分析当前系统的活动进程和锁情况。 5. 优化查询和索引:通过优化查询语句和确保合理的索引存在,减少不必要的锁和锁升级事件。...

    一次MYSQL死锁分析案例1

    在MySQL数据库中,死锁是一种常见的并发问题,当两个或多个事务互相等待对方释放资源时,就会发生死锁。本案例中的死锁发生在“pop购...在实际应用中,需要结合业务逻辑和数据库设计进行优化,避免类似死锁的情况发生。

    解决oracle死锁

    此外,`DBA DEADLOCKS`视图也可以帮助我们查找和分析死锁。 ```sql SELECT * FROM dba_deadlocks; ``` **解除死锁:** Oracle有一个内置的死锁检测机制,称为死锁检测器,它会在检测到死锁时自动选择一个事务进行...

    Oracle表死锁与解锁

    这两个查询分别提供了锁定资源的ID和请求状态,有助于进一步分析死锁情况。 一旦找到死锁,解决方法通常涉及终止一个或多个会话,以打破死锁循环。例如,可以使用`ALTER SYSTEM KILL SESSION`语句强制结束特定会话...

    oracle如何解除死锁

    ### Oracle如何解除死锁 在Oracle数据库环境中,死锁是一...通过以上分析,我们可以看到在Oracle数据库中如何识别和解决死锁问题。在实际应用中,还需要根据具体情况灵活运用这些方法,并结合业务需求做出合理的决策。

    银行提款机(SQL 查询分析器可直接运行)

    在描述中提到的“SQL查询分析器可直接运行”,意味着这个数据库脚本是用于管理ATM系统的后台数据库的。SQL(Structured Query Language)是用于管理关系数据库的标准语言,它被用来创建、更新和查询数据库。 这篇...

    Microsoft SQL Server Performance tunning with DMV

    关于“Microsoft SQL Server Performance Tuning with DMV”这一主题,我们需要了解的是SQL Server性能调优的精髓,以及如何利用动态管理视图(Dynamic Management Views,DMV)来监控和优化SQL Server数据库服务器...

    ORACLE表死锁的解决方法亲测有效!

    然而,在高并发的业务环境中,ORACLE表的死锁问题却时常困扰着数据库管理员(DBA)。死锁,作为数据库操作中的一种特殊现象,是指两个或更多的事务在等待对方释放资源时陷入无限等待的状态,从而导致所有涉及的事务...

    SQLServer 性能仪表盘(Performance Dashboard Reports)

    7. **死锁报告**:分析数据库中的死锁事件,提供死锁图和相关信息,帮助消除死锁问题。 8. **缓冲池命中率报告**:缓冲池命中率是衡量内存效率的关键指标,低命中率可能意味着过多的数据页需要从硬盘读取,影响性能...

    Microsoft SQL Server 2008 T-SQL Fundamentals

    这些语句使得在T-SQL中实现复杂的业务逻辑成为可能。书中还会涉及如何使用这些语句编写条件和循环结构,以及如何处理运行时错误。 附带的源代码文件《Microsoft SQL Server 2008 T-SQL Fundamentals Codes.rar》...

    sql 执行脚本

    本文将详细探讨"SQL作业明细"、"SQL消耗CPU情况"、"死锁相关语句过程"以及"后台语句执行情况",并关注"等待资源"与"前10个最耗CPU时间"的关键知识点。 首先,SQL作业明细指的是在数据库系统中定期或按需执行的一...

    最为经典的sql2005数据库案例

    改进的行版本控制(Row Versioning)和快照隔离级别,使得SQL Server 2005能更好地处理高并发场景,避免了死锁等问题,提升了多用户环境下应用的性能。 在这个案例中,“财务凭证管理系统”很可能是利用SQL Server...

Global site tag (gtag.js) - Google Analytics