频繁更新基础数据表造成的数据库死锁

简介:        最近,有个比较大的项目出现数据库死锁。经过分析数据库trace文件,发现死锁的是基础数据表疾病诊断。
       最近,有个比较大的项目出现数据库死锁。经过分析数据库trace文件,发现死锁的是基础数据表疾病诊断。根据对应的sql语句找到了问题所在,门诊医生录入诊断时,程序里面同时去更新疾病诊断基础表,造成诊断基础表被锁。

        经过分析,诊断基础表共27886条记录,分布在312个数据块中,每个数据块包含75到114条不等的记录。由于数据库服务器安装的oracle rac, 共两个节点,oracle的最小单位是数据块,当几百个门诊大夫一起录入诊断的时候,频繁的更新基础数据,造成数据块不停的在两个节点之间转换,而且很多病人都同时患多种疾病,大夫录入诊断的顺序也很可能不同,造成疾病诊断表被锁。

       另外从数据库trace文件中发现了itl锁,每个数据块上面的事务槽位上限是255,通过查询疾病诊断表,发现数据块里面最大的记录数也就才114行,而程序里面是按照值唯一的字段(无索引)去更新的记录,理论上应该不会出现itl锁,但是理论终归是理论,由于数据块里面数据插入之后的再更新,占用了一部分预留的10%的pctfree空间,造成了没有足够的可用空闲空间来支撑更多的事务并发,所以出现了itl锁,这些锁一起造成了部分大夫无法下诊断长达20分钟。

        这种在并发量很高的业务流程里面去更新常用的基础表,可以说,从设计上就是错误的。如今的项目,数据量都已经达到了很高的程度了,而且并发也越来越大,性能问题应该引起所有IT人员的注意。数据量少或者并发量低的时候,一些性能低的sql语句可能发现不了问题,但是随着系统运行时间的增长,定会有出现问题的那一天。

目录
相关文章
|
12月前
|
开发框架 数据库 数据安全/隐私保护
FastAdmin框架实现数据表的增删改查
FastAdmin框架实现数据表的增删改查
559 0
|
3月前
|
SQL 关系型数据库 MySQL
遇到mysql数据库死锁,你会怎么排查?
遇到mysql数据库死锁,你会怎么排查?
198 0
|
5天前
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
15 3
|
6天前
|
缓存 数据库 数据安全/隐私保护
Discuz! X 数据库字典详解:DZ各数据表作用及字段含义
我们使用DISCUZ做网站时,有时需要对数据表进行操作,在操作数据表之前,需要对数据表进行了解。下面是DISCUZ 数据库各数据表作用及字段含义详解,方便新手更好的了解DISCUZ数据库。
38 4
|
16天前
|
SQL 数据库
达梦数据库阻塞死锁及解锁
【10月更文挑战第6天】本文介绍了在达梦数据库中模拟和解决死锁的方法。首先通过创建表并插入数据但不提交事务,模拟了阻塞情况;接着利用V$TRXWAIT和V$SESSIONS视图查询阻塞信息,并通过SP_CLOSE_SESSION函数解决阻塞。最后讨论了死锁的成因及避免策略,强调了正确管理事务的重要性。
|
3月前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。
108 3
|
3月前
|
SQL Shell API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
|
4月前
|
Oracle 关系型数据库 数据库
关系型数据库Oracle死锁
【7月更文挑战第16天】
54 3
|
5月前
|
关系型数据库 数据管理 数据库
数据管理DMS产品使用合集之如何极速恢复RDS(关系型数据库服务)中的数据表
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
112 3
|
4月前
|
数据库
MybatisPlus3---常用注解,驼峰转下滑线作为表明 cteateTime 数据表中的 cteate_time,@TableField,与数据库字段冲突要使用转义字符“`order`“,is
MybatisPlus3---常用注解,驼峰转下滑线作为表明 cteateTime 数据表中的 cteate_time,@TableField,与数据库字段冲突要使用转义字符“`order`“,is