我正在使用.Net 1.1和SQL Server 2000构建企业应用程序。我使用读取已提交的隔离级别。然而,非功能性要求的变化使得有必要针对不可重复的读取和幻像采取措施。我看到两个选择:
引入行版本控制以检查行是否在事务中被读取后被修改。这是通过向表abd添加VersionId列来完成的,只要行更改,就会增加值。这将解决问题,但要求我们重写我们的应用程序的所有存储过程和数据访问层。
迁移到SQL Server 2005并使用快照隔离级别。这样可以省去重写代码的麻烦,但是有一些挑战: 一个。快速隔离级别在.Net 1.1中是未知的,因此我们必须额外往返服务器以手动设置它。 湾我们无法在存储过程中使用临时表,因为快照隔离级别不允许更改tempdb的模式。我不知道如何解决这个问题。
任何想法或建议都不仅仅是惠康
答案 0 :(得分:1)
我建议你升级到2005/2008并启用read committed snapshot选项。启用后,它会使任何要求读取提交的事务使用行版本控制而不是锁定。与完全快照隔离相比,它对TempDB的影响也更小。
您对临时表和快照有什么问题?我可以在快照隔离中创建临时表而不会出现问题。我所知道的唯一限制是你使用的是全局临时表。要使全局临时表正常工作,tempDB必须启用ALLOW_SNAPSHOT_ISOLATION
,或者必须在查询中添加锁定提示以将语句更改为另一个隔离级别。
答案 1 :(得分:0)
关于选项#2的一些想法:
您无需额外往返服务器。我可以想到3种不同的方法来避免它,包括将命令预先挂起到现有的查询字符串,移动到存储过程并在那里设置等等。
此外,您可以绕过SQL Server 2005并直接进入SQL Server 2008,现在已经发布了。
如果选择#1选项,请查看使用versionid列的timestamp数据类型。