ORA-00060 X锁和S锁死锁问题

lonten 2012-08-31 11:43:27
更新记录时根据流水号更新,t0,t1,t2,t3上建有视图。
怎么会发生这样的死锁,大家帮忙分析下,谢谢。

死锁发生时的日志文件如下。

DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-00070016-0000bdbe 59 136 X 67 123 S
TX-0006001c-0000b87a 67 123 X 59 136 S
session 136: DID 0001-003B-00000052 session 123: DID 0001-0043-00000012
session 123: DID 0001-0043-00000012 session 136: DID 0001-003B-00000052
Rows waited on:
Session 123: obj - rowid = 00009FDF - AAAJ/fAAEAAEPrIAAA
(dictionary objn - 40927, file - 4, block - 1112776, slot - 0)
Session 136: obj - rowid = 00009FE8 - AAAJ/oAAEAAEYL7AAA
(dictionary objn - 40936, file - 4, block - 1147643, slot - 0)
Information on the OTHER waiting sessions:
Session 123:
sid: 123 ser: 53765 audsid: 11800007 user: 32/tq
flags: (0x41) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
flags2: (0x8)
pid: 67 O/S info: user: tq, term: pts/tl, ospid: 4650
image: oracle@SD12pp12 (TNS V1-V3)
O/S info: user: tq, term: pts/tl, ospid: 4644, machine: SD12pp12
program: batch@SD12pp12 (TNS V1-V3)
application name: batch@SD12pp12 (TNS V1-V3), hash value=2269185292
Current SQL Statement:
update t0 set f_mana=(f_mana+:b0),f_madd=:b0,f_no=(f_no+:b2),f_iadd=:b2,f_cost=:b4,f_cadd=:b5,f_reward=:b6,f_fadd=:b7,d_last=:b8 where c_cno=:b9
End of information on OTHER waiting sessions.
Current SQL statement for this session:
update t3 set f_mana=(f_mana+:b0),f_madd=:b0,f_no=(f_no+:b2),f_iadd=:b2,f_cost=:b4,f_cadd=:b5,f_reward=:b6,f_fadd=:b7,d_last=:b8 where c_cno=:b9
===================================================
...全文
307 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonten 2012-09-11
  • 打赏
  • 举报
回复
还想问问大家,索引和统计分析会引起死锁吗?
lonten 2012-08-31
  • 打赏
  • 举报
回复
并发操作,处理完肯定有提交事务。
我对这个死锁还是不太明白,为什么是X锁和S锁产生死锁, 这里X锁应该是SX锁吧,但S锁怎么产生的呢?
睿智天成 2012-08-31
  • 打赏
  • 举报
回复
出现死锁,也就是两SESSION相互抬杠。ORACLE诊断后自动解除。
更新后有没有加commit;
lonten 2012-08-31
  • 打赏
  • 举报
回复
还是有几点不明白的地方,请大家再给解答下,谢谢。
同时说明一下处理的流程。
比如有5个产品,p1,p2,p3,p4,p5,
这五个产品在表t0,t1,t2,t3中可能都可能有记录存在;
在表t0,t1,t2,t3上建有视图V;
在程序处理时,根据产品并发,从视图中用游标查询相关产品的信息,经过处理后,根据流水号更新某些字段的值。

事务在更新不同的表,一个在update t0, 一个在update t3, 怎么会引起死锁?
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-00070016-0000bdbe 59 136 X 67 123 S
TX-0006001c-0000b87a 67 123 X 59 136 S
上面这个死锁图,是不是可以这样理解
session 136 持有一个X锁,在等待session 123 S锁
session 123 持有一个X锁,在等待session 136 S锁
这样理解的话 session 136 持有一个X锁和S锁, session 136 也持有一个X锁和S锁。做什么操作会让这个事务会同时持有这两个锁呢?
fw0124 2012-08-31
  • 打赏
  • 举报
回复
http://blog.csdn.net/fw0124/article/details/6227376
看看这个吧,update后及时提交,如果需要update多个表之后才提交,注意update的顺序,不同的会话之间要保持一致的顺序,才不会死锁。

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧