Gen*_*нин 1 database sql-server database-design locking transactions
难道我理解正确的是被用于并发性的悲观事务(TX)隔离模式,表/行锁提示ONLY?
换句话说,在SQL Server(2005及更高版本)提供的乐观TX隔离的参与期间何时可以使用表/行锁定提示?
如果后者提供内置乐观(也称为快照又称版本控制)并发隔离,那么在SQL Server2005 +中需要悲观的TX隔离级别/提示吗?
我确实读到悲观的选择是遗留的,不再需要了,尽管我有疑问.
此外,当需要手动编写乐观并发功能时,拥有内置SQL Server2005 +的乐观(即快照又称版本控制)TX隔离级别?
最后一个问题的灵感来自阅读:
描述自定义编码以在SQL Server中提供版本控制.
乐观并发需要更多资源,并且在发生冲突时更加昂贵.
两个会话可以读取和修改值,只有在尝试同时应用更改时才会发生冲突.这意味着在并发更新的情况下,两个值都应该存储在某个地方(当然这需要资源).
此外,当发生冲突时,通常应回滚整个事务或重新获取游标,这也很昂贵.
悲观并发模型使用锁定,从而降低并发性但提高性能.
在两个并发任务的情况下,第二个任务等待锁定释放比在两个同时工作上花费CPU时间和磁盘I/O然后更多回滚不那么幸运的工作并重做它可能更便宜.
说,你有这样的查询:
UPDATE mytable
SET myvalue = very_complex_function(@range)
WHERE rangeid = @range
Run Code Online (Sandbox Code Playgroud)
,very_complex_function从mytable自己读取一些数据.换句话说,此查询转换mytable共享值的子集range.
现在,当两个函数在同一范围内工作时,可能有两种情况:
悲观:第一个查询锁定,第二个查询等待它.第一个查询在10几秒钟内完成,第二个查询也完成.总计:20秒.
乐观:两个查询都独立工作(在相同的输入上).它共享CPU它们之间的时间加上切换时的一些开销.他们应该将他们的中间数据保存在某个地方,因此数据存储两次(这意味着两次I/O或内存).假设几乎在15几秒钟内同时完成.
但是,当提交工作时,第二个查询将发生冲突,并且必须回滚其更改(例如,它需要相同的15秒数).然后它需要再次重新读取数据并使用新的数据集(10秒)再次执行工作.
其结果是,这两个查询完整迟了悲观锁:15和40秒与10和20.
如果后者提供内置乐观(也称为快照又称版本控制)并发隔离,那么在SQL Server2005 +中需要悲观的TX隔离级别/提示吗?
乐观的隔离级别是乐观的.当您期望对数据产生高争用时,不应使用它们.
BTW,乐观隔离(对于读取查询)也是可用的SQL Server 2000.
| 归档时间: |
|
| 查看次数: |
1150 次 |
| 最近记录: |