Chinaunix

标题: 关于死锁 [打印本页]

作者: zolwjz    时间: 2009-04-01 16:59
标题: 关于死锁

有个问题请教
就是在客户端正在做增删改操作,未提交时,网络突然断掉,这时,是不是会出现死锁?

作者: welcome008    时间: 2009-04-02 19:57
好像要看设置,有的断了会提交,有的回滚

但是好像没见有说啥也不做的。

但是很可能默认就是啥也不错,造成锁

你可以这样试一下
然后再开一个终端查询一下,看是否有锁


另外,那个不是死锁,死锁是应该指两个同时等待的事件
作者: zolwjz    时间: 2009-04-02 21:45
标题: 回复 #2 welcome008 的帖子
记得设置的参数名吗?
作者: Meets_fan    时间: 2009-04-02 22:54
不会
作者: welcome008    时间: 2009-04-03 12:23
原帖由 zolwjz 于 2009-4-2 21:45 发表
记得设置的参数名吗?



sqlplus里

show all看一下
作者: sqmax    时间: 2009-04-03 13:07
这个要看开发工具,比如通过SQLPLUS修改的话,当你推出的时候,在SQLPLUS 里会自动执行ROLLBACK,而如果网络中断的话,本身服务器端的session并不会立即释放,如果软件编写的不好,再次连接数据库又产生新的session而再次提交相同的事务则有可能出现deadlock
作者: ziggler    时间: 2009-04-03 13:08
看事务如何设置的?
作者: Meets_fan    时间: 2009-04-03 13:13
lz 的情况, pmon 进程会自动清理的,根本不会出现什么死锁。
作者: sqmax    时间: 2009-04-03 13:47
原帖由 Meets_fan 于 2009-4-3 13:13 发表
lz 的情况, pmon 进程会自动清理的,根本不会出现什么死锁。



呵,pmon多长时间清理一次?trasaction的执行需要多久?为什么不会出现死锁?
作者: Meets_fan    时间: 2009-04-03 17:12
1  pmon 每3s 都执行wakeup 一次。
2  至被清除
3  清除以后,不会出现死锁。
  出现死锁的几率是很小的。
  想你说的再次执行同样是事务,即使在资源释放前也不会出现死锁
  如:
  A: 得到x, 得到y  断开
  再次连入:
  B: 根本就得不到x  所以就不会产生死锁

[ 本帖最后由 Meets_fan 于 2009-4-7 12:33 编辑 ]
作者: doni    时间: 2009-04-04 09:49
原帖由 Meets_fan 于 2009-4-3 13:13 发表
lz 的情况, pmon 进程会自动清理的,根本不会出现什么死锁。


可问题是,如果网络突然中断的话,连OS都可能认为这个联结是活动,那么PMON当然不会清理这个联结的session

当然这种情况只限于长联结,对于WEB应用上用PHP,ASP之类的短联结的话,不会有这种问题

[ 本帖最后由 doni 于 2009-4-4 09:52 编辑 ]
作者: Meets_fan    时间: 2009-04-04 11:17
原帖由 doni 于 2009-4-4 09:49 发表


可问题是,如果网络突然中断的话,连OS都可能认为这个联结是活动,那么PMON当然不会清理这个联结的session

当然这种情况只限于长联结,对于WEB应用上用PHP,ASP之类的短联结的话,不会有这种问题


Use parameter SQLNET.EXPIRE_TIME to specify a the time interval, in minutes, to send a probe to verify that client/server connections are active. Setting a value greater than 0 ensures that connections are not left open indefinitely, due to an abnormal client termination. If the probe finds a terminated connection, or a connection that is no longer in use, it returns an error, causing the server process to exit. This parameter is primarily intended for the database server, which typically handles multiple connections at any one time.

一般都要设置这个参数来避免这种问题的。
作者: doni    时间: 2009-04-04 18:26
原帖由 Meets_fan 于 2009-4-4 11:17 发表


Use parameter SQLNET.EXPIRE_TIME to specify a the time interval, in minutes, to send a probe to verify that client/server connections are active. Setting a value greater than 0 ensures that c ...


我只是讲问题的可能性
作者: xmltiger    时间: 2009-04-09 18:47
不会死锁。
一段时间后事务将会回滚,这段时间是os参数决定的,可参考操作系统的tcp/ip的KEEPALIVE参数

[ 本帖最后由 xmltiger 于 2009-4-9 18:48 编辑 ]
作者: sqmax    时间: 2009-04-10 13:29
原帖由 Meets_fan 于 2009-4-3 17:12 发表
1  pmon 每3s 都执行wakeup 一次。
2  至被清除
3  清除以后,不会出现死锁。
  出现死锁的几率是很小的。
  想你说的再次执行同样是事务,即使在资源释放前也不会出现死锁
  如:
  A: 得到x, 得到y  ...


兄弟说的是DCD的时候吧,可混合型的业务不是这样的,有OLAP&OLTP混杂,特别是有大的事物处理时发生,DEADLOCK的发生不管有没有sqlnet的EXPIRE参数都可能发生,特别是当一个大的事物已提交后,比如user A lock table 1,user B lock table 2,after user A try to lock table 2,and user B try to lock table 1;这种时候当user A断掉后,再次连入后,重新执行上述操作会使问题变的更麻烦
作者: sqmax    时间: 2009-04-10 13:32
原帖由 doni 于 2009-4-4 09:49 发表


可问题是,如果网络突然中断的话,连OS都可能认为这个联结是活动,那么PMON当然不会清理这个联结的session

当然这种情况只限于长联结,对于WEB应用上用PHP,ASP之类的短联结的话,不会有这种问题


还有引申的问题出来,pmon在数据库里删除session和操作系统删除process是不同的,如果反复这样操作会导致大量死进程占用了过多的系统资源,特别是c/s结构的程序
作者: doni    时间: 2009-04-10 14:59
是的,往往OS的用户的process都没有了,但oracle的session还在,v$session里可以看出是这个用户的,这个session的ppid是1
作者: gflei    时间: 2009-07-15 17:18
如果在断开的时候没有死锁,之后就不会有死锁,只会存在锁等待。

定期清理连接可能默认是没有设置。

因为之前遇到应用服务器与数据库之间有防火墙,防火墙会对长连接进行断开,但数据库没有对断开的连接进行清理,最后导致连接过多。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2