2013-05-10 69 views
-1

我有一份工作是更新一张桌子20分钟,在这些时刻我无法自然更新任何一行。如何在SQL Server 2008中用锁定表更新大量行?

有没有一种方法或方法来做到这一点?

工作可以更长,但我必须继续更新表格。

另一方面,如果作业中出现错误,作业应该回滚。

谢谢..

+0

FWIW,参见[基于行版本控制的隔离级别数据库引擎(HTTP:/ /msdn.microsoft.com/en-us/library/ms177404(v=sql.105).aspx)(和相关链接)。对于何时使用:“读者/写者阻塞的发生点在于并发的好处大于增加创建和管理行版本的开销。”请注意,它关于事务之间的*不阻塞*(即小于SERIALIZABLE);不一定关于整体表现。 – user2246674 2013-05-10 15:37:39

+0

哪种表格提示对于这种情况是正确的。我希望能够在更新钻孔表时更新一行? – 2013-05-10 20:23:27

+0

你不应该那样做。如果这项工作能够回滚,那么如果你转向更宽松的锁定策略(即,你将失去所有的交易完整性),你将会陷入糟糕的境地。 – 2013-05-11 11:02:29

回答

0

将工作拆分成单独的交易。在像SQL Server这样的专业数据库管理系统中,锁的工作方式是根据需要升级到更高的级别。一旦查询遇到了很多页面,它就更新为只读表锁定。在保持交易完整性的同时避免这种情况的唯一方法是将其分解成较小的工作。

+0

你有一个链接或一个很好的搜索词,你可以了解更多关于如何做你的建议吗? – 2013-05-10 17:58:59

+0

关于将大型工作分成更小的工作?唔,不? – 2013-05-11 11:01:01

0

正如Niels指出的那样,您应该尝试在批处理中明确提交事务中的每个批次来更新表。如果你正在创建足够的锁来保证表锁,那么你的机会也会增加你的事务日志。如果有必要,它可能值得检查并缩小到更合理的大小。

或者你可以尝试让其中“禁止基于锁的数量锁升级”跟踪标志1224或1211 - http://msdn.microsoft.com/en-us/library/ms188396.aspx