中国人寿数据库死锁处理

请求锁(request,肯定是后执行的)的SQL是直接能查到的,但加载锁(block,肯定是先执行的)的SQL是通过v$lock表找不到的,因为锁信息只记录了发起锁的session信息,而没有具体SQL信息。但通过一些方法可以定位:

假设有两个session分别执行SQL,第一个session修改了deptno=10和deptno=20的记录,但未提交,这时候会有锁:

接下来第二个session也尝试修改deptno=10的记录:

可以看到,请求加锁发生等待的SQL是782session的实际请求锁的SQL,但已加载锁的session 19执行的SQL是最后一次执行的修改deptno=20的SQL。所以我们无法直接查到首先加锁的SQL。

但我们可以从v$sql中查找first_load_time对比CTIME的时间进行比较,就能定位具体SQL:

但既然发生了锁竞争,肯定就是对同一条记录进行处理的冲突,所以实际上等待锁和之前的加锁的SQL应该是类似的

时间: 2024-10-27 08:31:03

中国人寿数据库死锁处理的相关文章

SqlServer定时备份数据库和定时杀死数据库死锁解决

PS:Sqlserver 2008 R2,windows 8 64位 1.备份数据库 因为要备份,我们就要用到Sqlserver的代理,默认数据库的代理是不开启的.需要我们手动开启的. 执行备份数据库脚本,现在将脚本公布,其实将这一段代码中需要保存的文件路径和数据库名称替换一下就可以实现备份了.但是还没有达到定时备份的目的 ? 1 2 3 4 5 6 7 8 9 10 11 --自动备份并保存最近5天的SQL数据库作业脚本 宋彪 20130310 DECLARE @filename VARCHA

nagios 添加自定义监控项目监控mysql数据库死锁

nagios 添加自定义监控项目 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 系统环境:CentOS Linux release 7.2.1511 (Core) nagios 版本: 2.15 这里配合pt-dead-logger插件了,运行了这个插件,有死锁就会在test.deadlocks表写入死锁的信息 这里通过检测这个表是否增加了行数来发报警 nagios客户端自定义脚本: ###这里为了省事,直接把数据库的用户,

Mybatis-update - 数据库死锁 - 获取数据库连接池等待

最近学习测试mybatis,单个增删改查都没问题,最后使用mvn test的时候发现了几个问题: update失败,原因是数据库死锁 select等待,原因是connection连接池被用光了,需要等待 get: 要勇于探索,坚持就是胜利.刚看到错误的时候直接懵逼,因为错误完全看不出来,属于框架内部报错,在犹豫是不是直接睡觉得了,毕竟也快12点了.最后还是给我一点点找到问题所在了. 同上,要敢于去深入你不了解的代码,敢于研究不懂的代码. 距离一个合格的码农越来越远了,因为越学越觉得漏洞百出,自己

InnoDB数据库死锁

场景描述 在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found when trying to get lock; try restarting transaction...). 问题分析 这个异常并不会影响用户使用,因为数据库遇到死锁会自动回滚并重试.用户的感觉就是操作稍有卡顿.但是监控老是报异常,所以需要解决一下. 解决方法 在应用程序中update的地方使用try-catch. 我自己封装了一个函数,如下. /** *

数据库死锁

最近做项目时,将原先单条插入更新数据库时改为批量插入更新.这样做的好处是降低了QPS(sql语句的数量),但是同时也带来一个问题,DB的行锁急剧增加. 由于批量更新执行时间长,导致资源被长时间锁定,从而导致了大量的死锁产生,即出现以下错误信息: Deadlock found when trying to get lock; try restarting transaction 借这个机会,研究一下数据库死锁的问题. 一. 什么是数据库死锁? 学过操作系统的人都知道,只有在并发的情况下,才会发生死

关于数据库死锁的检查方法

关于数据库死锁的检查方法 一.        数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错. 二.        死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错. 三.        死锁的定位方法通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台.1)用dba用户执行以下语

数据库查询超级慢,数据库死锁的查看与解决

今天帮同事解决问题,页面报“等待的操作过时”,设置断点发现数据库查询语句处异常,检查了数据库一通,发现连接数据库也连接不上了,搜了一圈找到解决办法.留着备用啦 首先查出死锁,可用sql语句 SELECT blocking_session_id '阻塞进程的ID', wait_duration_ms '等待时间(毫秒)', session_id '(会话ID)' FROM sys.dm_os_waiting_tasks 或者创建以下存储过程,查询出来 USE [master] GO /******

查询MS SQL Server数据库死锁的一个存储过程

查询Sqlserver数据库死锁的一个存储过程 使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁.死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉. 利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里. --创建或修改sp_who_lock存储过程 CREATE procedure sp_who_lock --ALTER procedure sp_who_lock as beg

数据库死锁的检查和解决方法

转自:数据库死锁的检查方法 数据库死锁的检查方法 一.         数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错.二.         死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错.三.         死锁的定位方法通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台.