我正在处理的应用程序必须处理许多需要更新数据库上的数据的ajax请求。
[Macromedia] [SQLServer JDBC驱动程序] [SQLServer]事务(进程ID 66)在锁定时陷入僵局通信缓冲资源 另一个进程并被选为死锁受害者。重新运行 事务。
对于读取,我已经使用了WITH (NOLOCK)
提示,这防止了大量读取死锁。
我可以做些什么来更好地处理写入?
CF CFL中的更新代码?
或者有没有办法让SQL Server锁定行而不是表?
有没有人尝试过实施CQRS?似乎解决了这个问题,但我不清楚如何处理:
由于
答案 0 :(得分:4)
以下是我对此的看法。
来自ColdFusion服务器端
我相信在更新数据库的ColdFusion代码周围使用命名的<cflock>
标记可以防止数据库服务器上的死锁问题。使用命名锁会使每个调用都是单线程的。但是,如果事务需要一段时间,您可能会在ColdFusion服务器端遇到超时,等待<cflock>
。在ColdFusion服务器端以这种方式处理它也可能会降低应用程序的速度。您可以在之前和之后进行一些负载测试,以了解此方法如何影响您的应用。
从数据库服务器端
首先让我说我不认为可以完全阻止数据库服务器上的死锁,只需最小化并妥善处理。我在TechNet上找到了这个参考资料 - Minimizing Deadlocks。该页面的第一句话:
虽然无法完全避免死锁,但遵循某些编码约定可以最大限度地减少产生死锁的可能性。
以下是该参考文献的要点。他们会详细介绍每个主题,所以请阅读原始资料。
最大限度地减少死锁可以提高事务吞吐量并减少系统开销,因为更少的事务是:
- 回滚,撤消交易执行的所有工作。
- 由应用程序重新提交,因为它们在死锁时被回滚。
帮助减少死锁:
- 以相同的顺序访问对象。
- 避免交易中的用户互动。
- 保持交易简短且一批。
- 使用较低的隔离级别。
- 使用基于行版本控制的隔离级别。
- 将READ_COMMITTED_SNAPSHOT数据库选项设置为ON以启用读取提交的事务以使用行版本控制。
- 使用快照隔离。
- 使用绑定连接。
“基于行版本控制的隔离级别”可能会回答您的问题或者有没有办法让SQL Server锁定行而不是表?。原始来源中提到了有关此选项的一些注释。
以下是我搜索过程中出现的一些其他参考资料:
Avoiding deadlock by using NOLOCK hint
Tips to avoid deadlocks? - 这个提到在使用NOLOCK
提示时要小心。