zoukankan      html  css  js  c++  java
  • 记一次Oracle数据库的死锁

    现象描述

    代码报错:
    ORA-00060: deadlock detected while waiting for resource
    一看是死锁,心里又惊又喜。我还没遇到过死锁呢,听说很难搞,正因为难搞才有意思啊,哈哈。

    原因定位

    通过查日志,查数据库,发现有两个事务(A,B)同时去更新数据库里同样的几条数据(1,2,3)。
    此时如果事务A拿到了数据1的锁,事务B拿到了数据2的锁。事务A想要去更新数据2,事务B想要去更新数据1,这样A,B就产生了死锁。但是查日志发现事务A是成功的。这就奇怪了,为什么单就B失败了呢?明明A也产生了死锁啊。
    原来当Oracle检测到死锁时就会牺牲掉某一方,从而让另一方继续执行,至于以什么依据来牺牲掉一方,我还没查到。。。

    解决方案

    优化了业务,让事务B只更新一条数据,所以B最多只能拥有一把锁,从而避免了死锁。

  • 相关阅读:
    ioremap函数
    kmalloc、kzalloc和vmalloc
    C语言 snprintf函数
    C语言 memset函数
    消息队列
    mount -a
    linux系统查看服务状态和启动停止服务
    Java中创建对象的内存图
    Java中数组在内存中的图解
    socket编程(Java实现)
  • 原文地址:https://www.cnblogs.com/liuwhut/p/14293251.html
Copyright © 2011-2022 走看看