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

时间:2014-03-04 19:19:06

标签: sql-server ajax coldfusion cqrs

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

  

[Macromedia] [SQLServer JDBC驱动程序] [SQLServer]事务(进程ID   66)在锁定时陷入僵局通信缓冲资源   另一个进程并被选为死锁受害者。重新运行   事务。

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

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

CF CFL中的更新代码?

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

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

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

1 个答案:

答案 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