一个录入学生考试成绩的BS系统,采用ASP.NET MVC(C#),数据库使用MSSQL2008!
学生成绩存放在Student表中。
每个客户端录入成绩时,一次录入每个考场30个学生的成绩。
操作人员录入结束以后,点击“确定录入”按钮,执行考场的更新方法,其中会执行30次每个学生的更新方法。
学生的更新方法会调用以下SQL语句:
Update Student Set WrittenScore = "" Where StuNum = ""
系统运行情况如下:
1、单个客户端执行,没有问题。
2、多个客户端执行,同时点击“确定录入”按钮的可能性极小,没有发现问题。
3、刻意测试极端情况:三个客户端同时点击“确定录入”按钮,出现死锁:
    其中一个稍微早些点击按钮的客户端能够正常执行;
    其余客户端在等待1-2秒后提出出现服务器错误。
    错误提示:进程XX(IDXX)出现死锁,并且作为死锁牺牲品被中止执行,请重新执行......我查询了很多资料,一般都说死锁出现的情况是两个不同的进程在已经锁住一个自己已经占有的资源的情况下,互相等待对方进程锁住的资源。
问题是我现在是多条Update语句同时更新同一张表,且互相不会同时更新同样的行,为什么会出现这个问题呢?
难道是Where语句在查询时也会锁死资源么?
请各位高手指点,谢谢了!!

解决方案 »

  1.   

    第一、你这个模式不会死锁,没改sql server的默认隔离级别的话,是读提交写独占的模式,同时update,还是会串行处理第一个来写,其他等待。
    第二、你把更新30个学生的sql作为事务执行,安全且效率高
    个人意见,高手多多指教
      

  2.   

    可以使用sql profiler来检测死锁是锁到哪个资源上了。你的StuNum 有索引吗?
    http://blog.csdn.net/roy_88/article/details/2686724看看大版的这个博客试试