2014-03-04 69 views
7

我正在处理的应用程序必须处理大量需要更新数据库上的某些数据的ajax请求。防止ColdFusion中DB死锁的解决方案?

[Macromedia] [SQLServer JDBC驱动程序] [SQLServer]事务(进程ID 66)在lock |通信缓冲区资源与另一个进程 并被选为死锁受害者。重新运行 交易。

对于读取,我已经使用了WITH (NOLOCK)提示,并且在读取时防止了很多死锁。

我能做些什么来更好地处理写入?

CFLock CF中的更新代码?

或者有没有办法让SQL Server锁定一个行而不是一个表?

有没有人尝试过实施CQRS?似乎解决了问题,但我不能就如何处理清楚:

  1. ID代(现在它采用自动递增的DB)
  2. 如何处理更新请求,如果服务器无法发送失败马上回到客户端。

感谢

+0

我假设你正在使用,因为标签的Microsoft SQL Server。你知道插入的表是否有聚簇索引? –

+0

@ScottJibben唯一的聚集索引将是PK。 – Henry

+0

即可。我发现没有聚集索引的大表会慢慢地慢慢插入。 –

回答

4

下面是我对这个想法。

从ColdFusion服务器端

我相信,使用名为围绕更新数据库可以防止数据库服务器上的僵局问题的ColdFusion代码<cflock>标签。使用一个命名锁可以使每个调用都是单线程的。但是,如果事务需要一段时间,则可能会在ColdFusion服务器端超时,等待<cflock>。在ColdFusion服务器端以这种方式处理它也可能会降低您的应用程序。您可以在之前和之后进行一些负载测试,以了解此方法如何影响您的应用。

从数据库服务器端

首先让我说,我不认为在数据库服务器上的死锁可以完全避免,只是最小化,并适当处理。我在TechNet上为您找到了此参考 - Minimizing Deadlocks。该页面的第一句话:

尽管无法完全避免死锁,但遵循特定的编码约定可以最大限度地减少生成死锁的机会。

以下是该参考文献的要点。他们会对每个主题进行更详细的介绍,所以请阅读原始资料。

尽量减少死锁可能提高交易量和减少系统开销,因为更少的交易是:

  • 回滚,撤销由事务执行的所有工作。
  • 由应用程序重新提交,因为它们在死锁时回滚。

为了最大限度地减少死锁:

  • 以相同的顺序访问对象。
  • 避免交易中的用户交互。
  • 保持交易短和在一个批次。
  • 使用较低的隔离级别。
  • 使用基于行版本控制的隔离级别。
    • 将READ_COMMITTED_SNAPSHOT数据库选项设置为ON,以启用读取已提交的事务以使用行版本控制。
    • 使用快照隔离。
  • 使用绑定连接。

的“基于行版本隔离级别”可以回答你的问题还是有办法让SQL Server以锁定的行,而不是表?。有关此选项的原始来源中提到了一些注释。

下面是我的搜索过程中提出了一些其他的参考文献:

Avoiding deadlock by using NOLOCK hint

How to avoid sql deadlock?

Tips to avoid deadlocks? - 此人提到使用NOLOCK提示时小心。

The Difficulty with Deadlocks

Using Row Versioning-based Isolation Levels