背景:
最近在做数据库迁移,为了评估新库的性能,我们找性能测试的同事压测了接口。压测完后发现一个接口频繁出现死锁的问题。这个接口是添加地址,一般的添加地址直接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)
相关推荐
SQL死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,它们都将无法继续执行。这种情况通常发生在以下场景:事务A持有资源X并请求资源Y,同时事务B持有资源Y并请求资源X,...
### SQL Server 死锁排查与解决方法 #### 一、SQL Server Profiler 监控数据库死锁 在处理SQL Server数据库中的死锁问题时,一个非常实用的工具就是SQL Server Profiler。它可以帮助我们捕捉到数据库运行过程中的...
死锁不仅会降低系统的整体性能,还可能导致数据处理异常中断,严重影响业务运行。因此,了解并掌握 SQL Server 死锁的处理方法对于 DBA 和开发人员来说至关重要。 #### 二、死锁检测与处理 本节将详细介绍如何检测...
### DB2死锁问题分析及解决方案 #### 一、引言 在数据库管理与维护过程中,死锁问题是一个常见的挑战,特别是在使用IBM DB2这样的大型关系型数据库管理系统时。本文将详细探讨DB2中死锁问题的分析方法及有效的解决...
2. **死锁分析** 当发生死锁时,SQL Server会生成一个XML死锁图,如描述中所示,包含在报警信息中。这个XML提供了死锁涉及的所有资源和事务的详细信息。分析XML可以帮助我们理解死锁的具体原因。例如,通过分析`...
4. 死锁分析工具:使用SQL Server提供的系统存储过程sp_who, sp_lock, sp_spaceused等来分析当前系统的活动进程和锁情况。 5. 优化查询和索引:通过优化查询语句和确保合理的索引存在,减少不必要的锁和锁升级事件。...
在进行数据库维护时,特别是在业务低峰期使用像pt-online-schema-change(pt-osc)这样的工具进行在线DDL操作时,可能会遇到死锁问题,这可能导致业务SQL被回滚,从而影响应用的正常运行。本文将深入探讨pt-osc的...
在MySQL数据库中,死锁是一种常见的并发问题,当两个或多个事务互相等待对方释放资源时,就会发生死锁。本案例中的死锁发生在“pop购...在实际应用中,需要结合业务逻辑和数据库设计进行优化,避免类似死锁的情况发生。
此外,`DBA DEADLOCKS`视图也可以帮助我们查找和分析死锁。 ```sql SELECT * FROM dba_deadlocks; ``` **解除死锁:** Oracle有一个内置的死锁检测机制,称为死锁检测器,它会在检测到死锁时自动选择一个事务进行...
这两个查询分别提供了锁定资源的ID和请求状态,有助于进一步分析死锁情况。 一旦找到死锁,解决方法通常涉及终止一个或多个会话,以打破死锁循环。例如,可以使用`ALTER SYSTEM KILL SESSION`语句强制结束特定会话...
### Oracle如何解除死锁 在Oracle数据库环境中,死锁是一...通过以上分析,我们可以看到在Oracle数据库中如何识别和解决死锁问题。在实际应用中,还需要根据具体情况灵活运用这些方法,并结合业务需求做出合理的决策。
在描述中提到的“SQL查询分析器可直接运行”,意味着这个数据库脚本是用于管理ATM系统的后台数据库的。SQL(Structured Query Language)是用于管理关系数据库的标准语言,它被用来创建、更新和查询数据库。 这篇...
关于“Microsoft SQL Server Performance Tuning with DMV”这一主题,我们需要了解的是SQL Server性能调优的精髓,以及如何利用动态管理视图(Dynamic Management Views,DMV)来监控和优化SQL Server数据库服务器...
然而,在高并发的业务环境中,ORACLE表的死锁问题却时常困扰着数据库管理员(DBA)。死锁,作为数据库操作中的一种特殊现象,是指两个或更多的事务在等待对方释放资源时陷入无限等待的状态,从而导致所有涉及的事务...
7. **死锁报告**:分析数据库中的死锁事件,提供死锁图和相关信息,帮助消除死锁问题。 8. **缓冲池命中率报告**:缓冲池命中率是衡量内存效率的关键指标,低命中率可能意味着过多的数据页需要从硬盘读取,影响性能...
这些语句使得在T-SQL中实现复杂的业务逻辑成为可能。书中还会涉及如何使用这些语句编写条件和循环结构,以及如何处理运行时错误。 附带的源代码文件《Microsoft SQL Server 2008 T-SQL Fundamentals Codes.rar》...
本文将详细探讨"SQL作业明细"、"SQL消耗CPU情况"、"死锁相关语句过程"以及"后台语句执行情况",并关注"等待资源"与"前10个最耗CPU时间"的关键知识点。 首先,SQL作业明细指的是在数据库系统中定期或按需执行的一...
改进的行版本控制(Row Versioning)和快照隔离级别,使得SQL Server 2005能更好地处理高并发场景,避免了死锁等问题,提升了多用户环境下应用的性能。 在这个案例中,“财务凭证管理系统”很可能是利用SQL Server...