防止ColdFusion中数据库死锁的解决方案?

Hen*_*nry 7 sql-server ajax coldfusion cqrs

我正在处理的应用程序必须处理许多需要更新数据库上的数据的ajax请求.

[Macromedia] [SQLServer JDBC驱动程序] [SQLServer]事务(进程ID 66)在锁定时死锁 与另一个进程通信缓冲资源并被选为死锁牺牲品.重新运行该交易.

对于读取,我已经使用了WITH (NOLOCK)提示,这防止了大量的读取死锁.

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

CFLL中的更新代码?

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

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

  1. ID生成(现在它在数据库上使用自动增量)
  2. 如果服务器无法立即将错误发送回客户端,如何处理更新请求失败.

谢谢

Mig*_*l-F 4

以下是我对此的想法。

从 ColdFusion 服务器端

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

从数据库服务器端

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

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

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

最大限度地减少死锁可以提高事务吞吐量并减少系统开销,因为更少的事务:

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

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

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

“基于行版本控制的隔离级别”可能会回答您的问题或者有没有办法让 SQL Server 锁定行而不是表?。原始来源中提到了有关此选项的一些注释。

以下是我在搜索过程中发现的一些其他参考资料:

使用 NOLOCK 提示避免死锁

如何避免sql死锁?

避免死锁的技巧?- 这个提到使用NOLOCK提示时要小心。

死锁的困难

使用基于行版本控制的隔离级别