插入期间表被锁定...网站无法使用(sql server 2008)
Posted
技术标签:
【中文标题】插入期间表被锁定...网站无法使用(sql server 2008)【英文标题】:Table locked during inserts... website unusable (sql server 2008) 【发布时间】:2009-09-12 23:37:35 【问题描述】:我有一个后台进程,它不断地实时插入表中。每小时可能有数千次插入(有一些更新)。 Web 应用程序使用同一个表来获取显示给用户所需的一些数据。
目前,每当后台进程运行其插入/更新时,Web 应用程序似乎被阻止并且无法访问数据库。
我想知道有什么好的解决方案。我应该创建另一个插入的表,然后将该表复制到另一个只读表吗?还有其他方法吗?
非常感谢任何帮助和建议!
【问题讨论】:
【参考方案1】:特别是对于 SQL Server,您可能希望更改数据库以打开 READ_COMMITTED_SHAPSHOT。
如果数据上有待处理的插入/更新,这基本上可以防止您的选择查询锁定。
【讨论】:
【参考方案2】:需要注意的一些事情是:
1) 您的插入/更新或选择查询是事务的一部分吗?如果是这样,请确保为您的特定情况设置了最有利的transaction isolation level。
2) 这张巨表上的索引是否过多?索引加快了选择,但减慢了插入和更新。确保您只有绝对需要的索引。
3) 与#2 相关。您是否缺少可以加快选择速度的索引?您的选择语句是否在进行全表扫描?查看查询执行计划以了解实际发生的情况。 (查询分析器可以帮助您)。
4) 考虑将您的大型数据复制到一个或多个只读数据库服务器,这些服务器可以处理选择流量,而读/写主表(即您现有的表)主要处理插入/更新流量。
5) 您是否有触发插入/更新操作的触发器,这些触发器可能会导致性能或锁定问题?
6) 您的应用程序是否遇到死锁事务?看看这个主题的MSDN article,看看它是否有帮助。另外,请确保您了解dining philosophers problem,这样您就可以避免死锁事务。
【讨论】:
【参考方案3】:如果您使用的是企业版,理想的解决方案是使用滑动窗口分区。本质上,您在同一个文件组上创建一个相同的表,将数据加载到所述表中,然后将表的分区“切换”到您的生产表中。实际操作只是元数据翻转,所以它或多或少是瞬间发生的。在这里查看更多信息: http://technet.microsoft.com/en-us/library/ms191160.aspx
【讨论】:
【参考方案4】:如果您只需要从 Web 应用程序中的表中读取数据,您可能想尝试对查询使用 READ_UNCOMMITTED 隔离级别。它不需要任何锁并读取未提交的数据。我不建议对银行应用程序这样做,但大多数典型的商业网络应用程序可能不会有问题。确保在查询后将隔离级别设置回您通常使用的级别(READ COMMITTED?)。
如果您不适合使用 READ_UNCOMMITTED,您可以熟悉 Row Versioning-Based isolation levels。例如,快照隔离使用乐观的方法来修改数据,从而减少了对行进行悲观锁定的需要。
【讨论】:
以上是关于插入期间表被锁定...网站无法使用(sql server 2008)的主要内容,如果未能解决你的问题,请参考以下文章