| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 725 人关注过本帖
标题:sqlserver 关于事物的问题讨论
只看楼主 加入收藏
andreabocell
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-3-28
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
sqlserver 关于事物的问题讨论
sqlserver 关于事物的问题讨论
情况如下:
如果sql对a表启动事务,进行读写操作
则在默认情况下 其他地方要是对a表进行查询操作就会卡在那边,必须等待事务结束后才能执行
有什么办法能够使得其他地方可以顺利提取数据的
查询了一些资料 说是降低db的隔离级别,但是实际程序开发过程中 还是会报错 事务死锁。
搜索更多相关主题的帖子: 程序开发 
2011-03-28 14:52
png
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:126
专家分:880
注 册:2010-10-6
收藏
得分:0 
--- 参与讨论,说得不一定对啊 ---

我觉得你有必要澄清一下具体情况.
(1) "... 卡在那边,必须等待事务结束后才能执行..." 和
(2) "... 还是会报错 事务死锁..."  是两个完全不同的概念.

(1) 举例
假定事物A持续 60秒
Beging Transaction A
 Update Student
 Set    Student_Last_Name = 'Lee'
 ...
 ...
 ..
Commit Transaction A  --                          

当事物A没有提交时,下面类似的查询只有等待 - 甚至有可能等上60秒
Select Student_Last_Name
From   Student
这个等待的过程是正常的现象.原因是SQL Server在事物A从开始执行到提交之前并不能肯定学生们的姓是张王李赵还是Lee.

针对你的问题"...有什么办法能够使得其他地方可以顺利提取数据的 ...", 答案应该是没有,原因如上.不过话又说回来,如果你能容忍结果的不确定性,不想等待, 可以执行类似下面的语句.也就是你所说的"...降低...隔离级别..."

Select Student_Last_Name
From   Student WITH (NOLOCK)

(2) 死锁说的是事物A等待事物B正在锁定的资源,同时事物B又等待事物A正在锁定的资源.换句话说无论等待多长时间,也不能A和B都完成.  设计程序可以尽可能减少死锁的情况,但不能完全排除. SQL Server有自动探测死锁的功能. 出现死锁后,SQL Server选择牺牲一事物, 如A, 使得事物B得以完成.

针对你的问题在于"...实际程序开发过程中 还是会报错 事务死锁 ..." 也许你可以考虑A和B尽可能少锁定对方的资源? 程序设计考虑出现死锁的情况后,如何应对?
2011-03-29 06:55
andreabocell
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-3-28
收藏
得分:0 
太感谢楼上的回复了 谢谢。。。。
我再把思路捋清楚下。
我们程序是java写的 后台用sql2008
java底层用ibatis,ibatis默认会对每条sql语句启动事务,导致程序并发操作的时候出现死锁
于是我开发人员就修改了ibatis的底层,将其事务去掉,程序就正常了
程序大多都是通过调用存储过程来执行较复杂的过程操作
我们存储过程中一旦启动事务,用户操作频繁,偶尔就会产生死锁问题
问题就纠结在这里,即时降低事务级别 也无济于事。
所以来这求教下大家。 谢谢。。
2011-03-29 07:48
andreabocell
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-3-28
收藏
得分:0 
Transaction (Process ID 57) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

这个是错误代码。。明细是死锁咯。
2011-03-29 07:50
stephenchern
Rank: 2
等 级:论坛游民
帖 子:6
专家分:30
注 册:2011-3-29
收藏
得分:0 
换个账号。 andreabocell也是我。
2011-03-29 07:59
png
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:126
专家分:880
注 册:2010-10-6
收藏
得分:0 
确定是死锁问题后,通常可以做两个方面的工作.

首先因为无法完全避免,程序设计需要考虑到如何处理死锁. 涉及到事物时可以使用 Try and Catch. 大体思路是先试着操作. 能通过则提交, 否则就回滚,等待,再试.

推荐你读下  http://msdn.(v=sql.80).aspx

其次 - 当然也是工作难点 - 针对参与死锁的事物,着重研究是否一定要用事物,可否一个事物变两个小事物,事物内有无不必要的内容,对表的操作能否顺序一致, 表的索引等等等等 (包括你提到的降低级别).

针对你的问题,既然只是偶尔产生死锁,也许你只需要做第一方面的工作?

2011-03-30 05:09
stephenchern
Rank: 2
等 级:论坛游民
帖 子:6
专家分:30
注 册:2011-3-29
收藏
得分:20 
感谢楼上
try 有用了
在网络上找到了另外一篇文章 写的非常好。
这里也给大家分享下。
http://atkins.
2011-04-02 14:09
快速回复:sqlserver 关于事物的问题讨论
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025620 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved