首页 新闻 会员 周边

事务(进程 ID 56)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

0
悬赏园豆:15 [已关闭问题] 关闭于 2017-07-14 08:15

并发查询和更新问题,为了防止同一条记录被多次返回,使用了别一张表记录已经被返回这的记录ID,不论结构是否合理,因为修改代价太大,只能优化SQL语句,等待高手。

代码如下:

复制代码
BEGIN TRAN
  
   --不加这句不会死锁,但会出现同一条记录被重复取出 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
INSERT INTO #TStudentCode(StudentCode,TaskHandledID,HandleStepId) SELECT TOP 1 SS.StudentCode,null,0 FROM [01_SubjectiveScoreInfo] AS SS INNER JOIN SubjectiveItemInfo AS SI ON SS.TestCode=SI.TestCode AND SS.MajorQuestionID=SI.MajorQuestionID AND SS.MinorQuestionID=SI.MinorQuestionID WHERE SS.TestCode=''' + @TestCode + ''' AND SI.QuestionGroupCode=''' + @QuestionGroupCode + ''' AND (SI.MinorQuestionCount=0 OR SI.MinorQuestionID>0) AND NOT EXISTS ( SELECT TOP 1 1 FROM [01_SubjectiveScoreInfoFlag] WHERE ID = SS.ID ) INSERT INTO [01_SubjectiveScoreInfoFlag](ID) SELECT SS.ID FROM [01_SubjectiveScoreInfo] AS SS INNER JOIN SubjectiveItemInfo AS SI ON SS.TestCode=SI.TestCode AND SS.MajorQuestionID=SI.MajorQuestionID AND SS.MinorQuestionID=SI.MinorQuestionID WHERE SS.TestCode=''' + @TestCode + ''' AND SI.QuestionGroupCode=''' + @QuestionGroupCode + ''' AND (SI.MinorQuestionCount=0 OR SI.MinorQuestionID>0) AND SS.StudentCode = (SELECT TOP 1 StudentCode FROM #TStudentCode) COMMIT TRAN
复制代码
问题补充:

主表为:[01_SubjectiveScoreInfo],已查询过的ID记录表为:[01_SubjectiveScoreInfoFlag] 。

空明流光的主页 空明流光 | 初学一级 | 园豆:106
提问于:2017-01-09 10:39
< >
分享
所有回答(1)
0

1 保持事务短小

2 查询时with(updlock,readpast)  锁定查询的记录

chinesern | 园豆:217 (菜鸟二级) | 2017-01-09 12:01

我试试

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2017-01-09 12:54

多谢,应该搞定了。原来要用排它锁才能不死锁。

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2017-01-09 14:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册