另类"死锁"

数据库死锁:
不同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博客 ” ,链接:http://blog.itpub.net/8984272/viewspace-619913/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8984272/viewspace-619913/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值