ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 另类"死锁"

另类"死锁"

原创 Linux操作系统 作者:棉花糖ONE 时间:2009-11-18 08:50:49 0 删除 编辑
数据库死锁:
不同session之间,因为等待对方释放资源,而导致死锁,这时候数据库会选择终止其中一个会话的sql,来解开死锁,最简单的条件是,
session A 等待 session B
session B 等待 session A,
这时候数据库会牺牲到其中的一个session,来释放资源,主流数据库都有自己的死锁检测机制

例子:
session 1:
SYS@oracle10g>delete from test_a;
已删除2行。
session 2:
SYS@oracle10g>delete from test_b;
已删除2行。

session 1:

SYS@oracle10g>delete from test_b;
delete from test_b
            *
第 1 行出现错误:
ORA-00060: 等待资源时检测到死锁

session 2:

SYS@oracle10g>delete from test_a;

这时候我们假设数据库不做自动去解开死锁,那么这2个session将一直阻塞对方,2个session谁也跑不下去.

回到主题:
我在标题里的死锁加上了引号,说明这个不是单纯的数据库死锁,但是数据库死锁,数据库自己会去牺牲其中的一个session,来解开死锁,但是我碰到的死锁是,"永远也跑不掉的死锁",除非人工去干预.

程序代码大概是这样的:

for(   )
{
  function() ;
  .......
}
这个方法是个同步方法,同时这个方法也是个操作数据库的方法.
我们假设这样一种情况:
进程a,进入循环后会调用到这个同步方法,对数据库做更改,假设这时候操作了记录A
这时候,进程b,也进入到循环,它也会调用到这个同步方法,假设b也操作到记录B
那么由于数据库的锁机制,进程b必然会去等待进程a,这就是我们常见的锁阻塞,
这时候进程a,还在循环里执行,进程a又会调用到这个同步方法,由于进程b一直操纵着
这个同步方法,所以这时候进程a必须等待进程b执行完这个方法,这时候就出现
进程B等待进程A释放数据库上的锁,进程A等待进程B释放线程锁,单独从数据库和程序
角度来看,都只是锁等待,而从系统角度上看,就是死锁,2个进程互相等待对方释放资源,
这时候因为程序和数据库谁也控制不了谁,所以就出现了2个进程都跑不下去的情况,只能
手工去杀掉一个进程,让另一个进程继续执行.

这是个典型的应用程序设计上的问题,因为数据库的锁机制我们无法控制,所以只能通过
程序上的改动来绕过这个问题

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8984272/viewspace-619913/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-11-17

  • 博文量
    19
  • 访问量
    72272