繁体   English   中英

通过故意进行的+高并发事务来最大程度地减少死锁?

[英]Minimizing deadlocks with purposely contrived + highly concurrent transactions?

我目前正在努力对SQL Server 2008中的不同隔离级别进行基准测试-但是现在,我仍停留在一个看似微不足道的死锁问题上,但我似乎无法弄清楚。 希望这里有人可以提供建议(我是SQL的新手)

我当前有两种类型的事务(以演示脏读,但这无关紧要):

交易类型A:从表A中选择所有行。

事务类型B:在表A的所有行中将值'cost'设置为0,然后立即回滚。

我目前运行的线程池有1000个线程和10,000个事务,其中每个线程在执行事务类型A和事务类型B之间随机选择。但是,即使使用强制行锁定,我也会遇到大量死锁。

我假设死锁是由于获取锁的行顺序而发生的-也就是说,如果类型A和类型B“扫描”表A的顺序相同(例如,从上到下),则不会发生这种死锁。 但是,我在弄清楚如何使SQL Server维护SELECT和UPDATE语句期间的行顺序时遇到了麻烦。

有小费吗? 第一次到stackoverflow的海报,所以请谨慎:-)

编辑:隔离级别被有意地设置为READ_COMMITTED,以表明它消除了脏读(确实如此)。 死锁仅在等于或高于READ_COMMITTED的任何级别上发生; 显然,在READ_UNCOMMITTED上没有死锁。

编辑2:这些事务正在SQL Server 2008R2上的AdventureWorks LT的新实例上运行。

如果要启动事务以更新所有行,请键入B,然后回滚该事务,则将需要为所有行上的整个事务持有该锁。 即使您具有行级锁,也需要为整个事务保留该锁。

如果您具有页面级或表级锁定,则死锁可能会更少,因为对于SQL Server来说,死锁更容易处理,但是在事务进行过程中,您仍然需要整体上持有这些锁。

在设计高度并发的系统时,应避免使用锁定整个表的查询。 我建议使用以下MicroSoft指南来了解锁并减少锁的影响:

http://technet.microsoft.com/zh-CN/library/cc966413.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM