@_@ 如何解决数据库死锁

vosov 2008-05-21 10:14:47
若干后台服务同时运行,根据收到的各种文件处理各种业务逻辑。比如

业务A:
db.BeginTransaction();
读订单表;
更新零件表;
更新车辆表;
更新订单表;
db.Commit();

业务B:
db.BeginTransaction();
删除车辆;
读订单;
删除零件;
更新订单;
db.Commit();

很多业务逻辑。很多表。数据库为Oracle 9i,会出现“ORA-00060: 等待资源时检测到死锁”
通常解决死锁的方法似乎都不适用。比如及时Commit,用相同的顺序访问资源等等。
应该怎么办呢。谢谢谢谢。。。。。。。
...全文
473 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
优途科技 2008-05-23
  • 打赏
  • 举报
回复
帮顶。学习!
syeerzy 2008-05-23
  • 打赏
  • 举报
回复
大学没读好哦...死锁3要素以及解除死锁的方式貌似是必读...........




wzy_love_sly 2008-05-23
  • 打赏
  • 举报
回复

这个语法感觉是为了避免“不可重复读”。而我现在需要并发对多个表进行各种各样的操作。
比如某业务更新了A表,然后需要更新B表。而另一个业务恰好更新过B表,需要更新A表。这时就会发生死锁


把更新更新了A表,然后需要更新B表这段写在sql事务里,同时加锁测试
llx529 2008-05-23
  • 打赏
  • 举报
回复
db.BeginTransaction();
try
{
读订单表;
更新零件表;
更新车辆表;
更新订单表;
db.Commit();
}catch
{
db.Rollback();
}
TLJewel 2008-05-21
  • 打赏
  • 举报
回复
不会,我也在问问题,帮你顶
vosov 2008-05-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yagebu1983 的回复:]
select @MaxValue=MaxValue from MaxValue with (UPDLOCK) Where Model=@Model and Item=@Item
注意红色的地方!!
[/Quote]
搜了一下,这是sqlserver的语法。oracle里用:
select * from tuser for update [of tuser.colname]
他会锁定该select语句选定的行,但与sql不同,它不会自动解除该锁,除非显式调用commit 或rollback.
http://topic.csdn.net/t/20010627/15/173183.html

这个语法感觉是为了避免“不可重复读”。而我现在需要并发对多个表进行各种各样的操作。
比如某业务更新了A表,然后需要更新B表。而另一个业务恰好更新过B表,需要更新A表。这时就会发生死锁
wzy_love_sly 2008-05-21
  • 打赏
  • 举报
回复
用锁,但肯定是影响性能
yagebu1983 2008-05-21
  • 打赏
  • 举报
回复
加锁
yagebu1983 2008-05-21
  • 打赏
  • 举报
回复
select @MaxValue=MaxValue from MaxValue with (UPDLOCK) Where Model=@Model and Item=@Item
注意红色的地方!!
vosov 2008-05-21
  • 打赏
  • 举报
回复
自己啊噗>_<

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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