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

我正在处理的应用程序必须处理大量需要更新数据库数据的ajax请求。

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

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

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

CF中锁定CF中的更新代码?

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

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

  • ID生成(现在它使用数据库上的自动递增)
  • 如果服务器无法立即将错误返回给客户端,那么如何处理更新请求将失败。
  • 谢谢


    这是我的想法。

    来自ColdFusion服务器端

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

    从数据库服务器端

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

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

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

    最小化死锁可以提高事务吞吐量并减少系统开销,因为更少的事务是:

  • 回滚,撤销交易执行的所有工作。
  • 由应用程序重新提交,因为它们在死锁时回滚。
  • 为了帮助减少死锁:

  • 按相同顺序访问对象。
  • 避免交易中的用户交互。
  • 保持交易简短并且在一个批次中。
  • 使用较低的隔离级别。
  • 使用基于行版本控制的隔离级别。
  • 将READ_COMMITTED_SNAPSHOT数据库选项设置为ON以启用读取已提交的事务以使用行版本控制。
  • 使用快照隔离。
  • 使用绑定连接。
  • “基于行版本化的隔离级别”可能会回答你的问题或者有没有办法让SQL Server锁定一个行而不是一个表? 有关此选项的原始来源中提到了一些注释。

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

    通过使用NOLOCK提示避免死锁

    如何避免sql死锁?

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

    僵局的困难

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

    链接地址: http://www.djcxy.com/p/77869.html

    上一篇: Solution for preventing DB deadlock in ColdFusion?

    下一篇: height is uneven. Larger space above text than under