我是否正确理解表/行锁提示仅用于并发的悲观事务(tx)隔离模型?
换言之,在使用SQL Server(2005及更高版本)提供的乐观TX隔离期间,何时可以使用表/行锁提示?
在sql server2005+中,如果后者提供内置的乐观(又名快照,又名版本控制)并发隔离,何时需要悲观的tx隔离级别/提示?
我确实读到悲观的选择是遗留下来的,不再需要了,尽管我有疑问。
另外,内置了乐观(也称为快照,也称为版本控制)tx隔离级别的sql server2005+,
何时需要手动编写乐观并发特性的代码?
最后一个问题的灵感来自于阅读:
"Optimistic Concurrency in SQL Server" (September 28, 2007)
描述在SQL Server中提供版本控制的自定义编码。

最佳答案

乐观并发需要更多的资源,在发生冲突时代价更高。
两个会话可以读取和修改值,只有当它们尝试同时应用更改时才会发生冲突。这意味着在并发更新的情况下,两个值都应该存储在某个地方(这当然需要资源)。
另外,当发生冲突时,通常应该回滚整个事务或重新提取游标,这也很昂贵。
悲观并发模型使用了锁,从而降低了并发性,但提高了性能。
在两个并发任务的情况下,第二个任务等待一个锁释放可能比在两个并发工作上花费CPU时间和磁盘I/O要便宜,然后在回滚不太幸运的工作并重做它上花费更多。
假设,您有这样一个查询:

UPDATE  mytable
SET     myvalue = very_complex_function(@range)
WHERE   rangeid = @range

,从very_complex_function自身读取一些数据。换句话说,该查询转换共享mytable值的mytable的子集。
现在,当两个函数在同一范围内工作时,可能有两种情况:
悲观:第一个查询锁定,第二个查询等待它。第一个查询在range秒内完成,第二个也完成。总计:10秒。
乐观:两个查询都独立工作(在相同的输入上)。它们之间的时间共享加上一些切换开销。它们应该将中间数据保存在某个地方,这样数据就存储了两次(这意味着两次20或内存)。假设两个几乎同时完成,在CPU秒内。
但是,当提交工作的时候,第二个查询将发生冲突,并且必须回滚其更改(例如,它需要相同的I/O秒)。然后,它需要重新读取数据并使用新的数据集(15秒)再次执行该工作。
结果,两个查询都比悲观锁定完成得晚:1510秒,而不是1540
在sql server2005+中,如果后者提供内置的乐观(又名快照,又名版本控制)并发隔离,何时需要悲观的tx隔离级别/提示?
乐观的隔离度是乐观的。当您期望数据的高争用时,不应该使用它们。
顺便说一下,10中也提供了乐观隔离(用于读取查询)。

关于sql-server - 什么时候更喜欢悲观的事务隔离模型而不是乐观的模型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4088430/

10-12 15:54