SQL Server 幻读 的真实案例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SQL Server 幻读 的真实案例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2658字,纯文字阅读大概需要4分钟。
内容图文
![SQL Server 幻读 的真实案例](/upload/InfoBanner/zyjiaocheng/480/75bc8f69491f4526b013e22faee95e72.jpg)
因之前代码中存在大量的insert into select *的语句,加一个字段什么也不做也会导致整个项目瘫痪,当然我不想去讨论前人的代码质量。
于是乎我加了一个新表[01_SubjectiveScoreInfoFlag]来进行记录取过的记录ID。于是就有了如下的代码:
BEGIN TRAN SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; INSERT INTO [01_SubjectiveScoreInfoFlag](ID) SELECT TOP 100 SS.ID FROM [01_SubjectiveScoreInfo] AS SSINNER 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 ) COMMIT TRAN
此处用到了事务,并且指定了隔离级别。这个是必须的,我们之前就是没有指定,单线程无论你怎么调用这段代码运行都非常可靠,但多线程模拟并发调用时就出现了非常严重的重复。
上面的代码也并没有解决问题,原因是锁用得不对,多线程直接就出现了死锁现象。因之前对于隔离级别没什么经验,我一度曾经以为这个问题是无解的,直到今天突然被解开了。
按照我自己的理解,是因为锁的级别不够,导致了资源争抢。
就相当于上厕所时,一定要获取完全的排它锁,关好门不让其它人进来;否则如果其它人进来了,虽然他没有占到位子,但他拿走了手纸。你占着位子却没有手纸,他拿着手纸却没有位子,双方互不相让,谁也无法完成上厕所的事务,相持不下,进而导致死锁。这时就需要厕所管理出面,要么强制让你让出位子走人,不管理你擦没擦屁股;要么抢来手纸赶走他,任他拉到裤子上。
于是乎就有了下面的代码:
BEGIN TRAN SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; INSERT INTO [‘+@CourseID+‘_SubjectiveScoreInfoFlag](ID) SELECT TOP 100 SS.ID FROM [‘+@CourseID+‘_SubjectiveScoreInfo] AS SS WITH(UPDLOCK) INNER JOIN SubjectiveItemInfo AS SI WITH(UPDLOCK) 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 [‘+@CourseID+‘_SubjectiveScoreInfoFlag] WITH(UPDLOCK) WHERE ID = SS.ID ) COMMIT TRAN
UPLOCK是排它锁,这样就没有死锁了。
SQL Server 幻读 的真实案例
标签:单线程 可靠 指定 font group from item isolation insert
本文系统来源:http://www.cnblogs.com/nanfei/p/6265279.html
内容总结
以上是互联网集市为您收集整理的SQL Server 幻读 的真实案例全部内容,希望文章能够帮你解决SQL Server 幻读 的真实案例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。