学生成绩存放在Student表中。
每个客户端录入成绩时,一次录入每个考场30个学生的成绩。
操作人员录入结束以后,点击“确定录入”按钮,执行考场的更新方法,其中会执行30次每个学生的更新方法。
学生的更新方法会调用以下SQL语句:
Update Student Set WrittenScore = "" Where StuNum = ""
系统运行情况如下:
1、单个客户端执行,没有问题。
2、多个客户端执行,同时点击“确定录入”按钮的可能性极小,没有发现问题。
3、刻意测试极端情况:三个客户端同时点击“确定录入”按钮,出现死锁:
其中一个稍微早些点击按钮的客户端能够正常执行;
其余客户端在等待1-2秒后提出出现服务器错误。
错误提示:进程XX(IDXX)出现死锁,并且作为死锁牺牲品被中止执行,请重新执行......
我查询了很多资料,一般都说死锁出现的情况是两个不同的进程在已经锁住一个自己已经占有的资源的情况下,互相等待对方进程锁住的资源。
问题是我现在是多条Update语句同时更新同一张表,且互相不会同时更新同样的行,为什么会出现这个问题呢?
难道是Where语句在查询时也会锁死资源么?
请各位高手指点,谢谢了!!
8 个解决方案
#1
第一、你这个模式不会死锁,没改sql server的默认隔离级别的话,是读提交写独占的模式,同时update,还是会串行处理第一个来写,其他等待。
第二、你把更新30个学生的sql作为事务执行,安全且效率高
个人意见,高手多多指教
第二、你把更新30个学生的sql作为事务执行,安全且效率高
个人意见,高手多多指教
#2
谢谢楼上,我去试试事务!!
#3
#4
刻意测试极端情况
楼主的情况是假想的吧?从来从来没见过楼主的情况
按你的情况,最多是行锁,不可能因为不同客户端同时提交(一条)数据造成表锁
楼主的情况是假想的吧?从来从来没见过楼主的情况
按你的情况,最多是行锁,不可能因为不同客户端同时提交(一条)数据造成表锁
#5
可以使用sql profiler来检测死锁是锁到哪个资源上了。你的StuNum 有索引吗?
http://blog.csdn.net/roy_88/article/details/2686724看看大版的这个博客试试
http://blog.csdn.net/roy_88/article/details/2686724看看大版的这个博客试试
#6
楼上,没有索引,当时觉得很简单一个应用,没有考虑那么多?
#7
没有新线索么?我还是去试试事务吧!
#8
不是假想情况,我们会在一天内录入2000多考场的70000多学生的成绩,所以设定多个账户同时录入。
#1
第一、你这个模式不会死锁,没改sql server的默认隔离级别的话,是读提交写独占的模式,同时update,还是会串行处理第一个来写,其他等待。
第二、你把更新30个学生的sql作为事务执行,安全且效率高
个人意见,高手多多指教
第二、你把更新30个学生的sql作为事务执行,安全且效率高
个人意见,高手多多指教
#2
谢谢楼上,我去试试事务!!
#3
#4
刻意测试极端情况
楼主的情况是假想的吧?从来从来没见过楼主的情况
按你的情况,最多是行锁,不可能因为不同客户端同时提交(一条)数据造成表锁
楼主的情况是假想的吧?从来从来没见过楼主的情况
按你的情况,最多是行锁,不可能因为不同客户端同时提交(一条)数据造成表锁
#5
可以使用sql profiler来检测死锁是锁到哪个资源上了。你的StuNum 有索引吗?
http://blog.csdn.net/roy_88/article/details/2686724看看大版的这个博客试试
http://blog.csdn.net/roy_88/article/details/2686724看看大版的这个博客试试
#6
楼上,没有索引,当时觉得很简单一个应用,没有考虑那么多?
#7
没有新线索么?我还是去试试事务吧!
#8
不是假想情况,我们会在一天内录入2000多考场的70000多学生的成绩,所以设定多个账户同时录入。