解决oracle死锁,生产问题,ORA-00060: deadlock detected while waiting for resource,

这篇具有很好参考价值的文章主要介绍了解决oracle死锁,生产问题,ORA-00060: deadlock detected while waiting for resource,。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

项目场景:

问题描述

原因分析:

解决方案:

其他解决方案:

项目场景:

oracle 数据库在做大量的批量更新同一张表数据。


问题描述

早上来公司去生产环境查grelog日志,发现ERROR日志,点进去看后报如下错误:

ORA-00060: deadlock detected while waiting for resource

原因分析:

从错误的中一看就知道oracle 数据库发生了死锁。去生产的log日志查看,发现同一时间点左右,还有一个批量更新同一条数据的慢sql 日志。这个慢sql 的更新和这个死锁的sql 更新互斥了。导致了死锁。 死锁的异常抛出后,这个慢sql 就执行成功了。

在本地也写单元测试实例,跑出了同样的结果。猜测是因为更新主键SequenceNo更新时乱序导致的死锁。


解决方案:

在执行批量更新前,先对主键序列号进行排序,然后在进行批量更新。

例如:A线程更新的主键是1,2,3  B线程更新的主键是3,2,1 当批量更新时就可能会死锁,但是排序后,A线程更新的主键是1,2,3 B线程更新的主键是1,2,3 这是就不会产生死锁,测试过。这种情况多线程,跑了两天也没发生过死锁。

代码如下:

objects.stream().sorted((a1, a2) -> a1.getSequenceNo().compareTo(a2.getSequenceNo()));
        int[] execute = dsl.batchUpdate(objects.stream().map(i -> {
            ARecord r = new ARecord();
            r.setSequenceNo(i.getSequenceNo());
            r.setTime(i.getTime());
            r.setResult(i.getResult());
            r.changed(table.SEQUENCE_NO, false);
            return r;
        }).collect(Collectors.toList())).execute();
        return Integer.parseInt(String.valueOf(Arrays.stream(execute).count()));

其他解决方案:

当时讨论的还有其他解决方案,如下:

1 可以更新前加锁,避免导致死锁

2 可以把批量更新成单条更新操作

但是通过分析发票,这些方案都是会影响程序的性能,导致性能变慢,还有对代码的修改比较大,有很大的不确定性和风险。综上综合考虑选择批量更新前排序解决次问题。文章来源地址https://www.toymoban.com/news/detail-585148.html

到了这里,关于解决oracle死锁,生产问题,ORA-00060: deadlock detected while waiting for resource,的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Oracle Merge Into ORA-00001: unique constaint violated问题

    最近使用Datax同步进行定时数据同步,并在同步完之后进行回调sql进行统计操作。对应的ORACLE表结构如下: 回调对应的SQL如下: 回调SQL执行过程中,触发了  ORA-00001: unique constaint violated 的错误,其中USING部分的数据没有重复的,并且表中也没有和USING表中重复的,但是这里面

    2024年02月09日
    浏览(39)
  • Mysql和Oracle数据库死锁查看以及解决

    一、Mysql数据库死锁排查 SQL : SQL: SQL: 示例: 备注:通过查看事务的trx_started(开始时间)来判断该事务的阻塞时间。 SQL  : 备注:线程ID指的是 1.1.3步骤中查询出来的 trx_mysql_thread_id。 SQL : 示例 : 字段解析 : SQL : 示例: SQL : 备注:多个session用逗号隔开。 View Code   造

    2024年01月20日
    浏览(33)
  • Oracle数据库ORA-01507: database not mounted解决方法

    连接上安装好的oracle后,执行SQL报ORA-01507: database not mounted错误,根据百度ORA-01507: database not mounted的解决办法,问题解决了,下面详细介绍一下这个方法: 执行sql命令: shutdown ,并退出sqlplus /oracle/SHP/11204/是本例的oracle的家目录,要根据自身安装目录做修改 语句为 fuser -u l

    2024年02月16日
    浏览(30)
  • oracle pdb创建directory报ORA-65254,报错分析和解决

    oracle 19c在创建PDB过程中如果使用了带 PATH_PREFIX 的参数, 意味着在创建DIRECTORY目录时需要指定相对路径,而不能指定其它绝对路径。 今天遇到了报错,路径及权限无误,却依然报错。 create or replace directory expdp as \\\'/tmp\\\'; create or replace directory expdp as \\\'/tmp\\\' * ERROR at line 1: ORA-65254:

    2024年02月08日
    浏览(41)
  • 分析ORACLE批量更新中的ORA-00911错误:MyBatis <foreach> 场景与解决方案

            在日常的Java开发过程中,尤其是当我们在使用MyBatis作为持久层框架进行Oracle数据库操作时,批量更新数据是非常常见的需求。然而,在利用MyBatis的 foreach 标签遍历集合参数动态构造SQL更新语句时,有时会遭遇ORA-00911: invalid character错误。这种错误表明在提交给O

    2024年04月23日
    浏览(32)
  • Oracle ORA-01033: ORACLE initialization or shutdown in progress(误删了DBF数据库文件导致)解决方法

    先声明一下前期的一些手欠欠儿的操作导致oracl登录不进去了,起先是清理磁盘空间的时候误删除了orcle DBF数据文件后无法进入系统,plsql登录报错如下: 一般情况下,删除表空间的正确方法是: DROP TABLESPACE BDCDJ INCLUDING CONTENTS AND DATAFILES; 如果没有通过以上命令删除而直接删

    2024年02月02日
    浏览(45)
  • 【oracle】【解决方案】ORA-12514:TNS: 监听程序当前无法识别连接描述符中请求的服务

    Oracle11g,报错代码为:ORA-12514:监听程序当前无法识别连接描述符中请求的服务。 出现该问题一般有两种情况。 第一种是在你安装完之后未配置监听(在此我暂时忘记安装完之后有没有配置监听); 第二种是之前配置了监听但是系统未写入到listener.ora文件中( 在此我暂未搞明

    2024年02月01日
    浏览(42)
  • 重启Linux服务器 Oracle 数据库步骤 重启数据库startup 报ORA-01031 insufficient privileges错误解决

    在一次重启数据库的时候,没有正确按照步骤重启数据库,导致服务器重启。 正确步骤及详解: (1) su - oracle 打开Xshell,连接到数据库所在的linux机器。若用户为root,请输入命令“su - oracle”并回车,若要密码,输入密码后并回车,就切换到了oracle用户下。 检测方法:“#”变

    2024年02月15日
    浏览(32)
  • 解决ORA-01400报错过程中遇到的问题

    报错信息:ORA-01400: cannot insert NULL into (\\\"OWNER\\\".\\\"TABLE_NAME\\\".\\\"COLUMN_NAME\\\") 问题原因:对不允许为NULL的字段插入了NULL。 解决办法:要么赋给该字段一个值使它不为空,要么执行 alter table \\\"TABLE_NAME\\\" modify \\\"COLUMN_NAME\\\" NULL; 使该字段允许为空。但有时候执行上面语句会返回报错: ORA-01451

    2024年02月12日
    浏览(42)
  • oracle查看死锁以及处理死锁

    1. 查看死锁 2. 处理死锁 将上面查询出来的sid以及serial放入到下面的sql中进行替换就可以了 示例:alter system kill session \\\'4404,63693\\\';

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包