在ColdFusion中防止数据库死锁的解决方案?
我正在处理的应用程序必须处理大量需要更新数据库数据的ajax请求。
[Macromedia] [SQLServer JDBC驱动程序] [SQLServer]事务(进程ID 66)在lock |上死锁 通信缓冲区资源与另一个进程并被选为死锁受害者。 重新运行交易。
对于读取,我已经使用了WITH (NOLOCK)
提示,并且在读取时防止了很多死锁。
我能做些什么来更好地处理写入?
CF中锁定CF中的更新代码?
或者有没有办法让SQL Server锁定一个行而不是一个表?
有没有人尝试过实施CQRS? 似乎解决了这个问题,但我不清楚如何处理:
谢谢
这是我的想法。
来自ColdFusion服务器端
我确实认为使用更新数据库的ColdFusion代码中的名为<cflock>
标记可以防止数据库服务器上的死锁问题。 使用一个命名锁可以使每个调用都是单线程的。 但是,如果事务需要一段时间,则可能会在ColdFusion服务器端出现超时,等待<cflock>
。 在ColdFusion服务器端以这种方式处理它也可能会降低您的应用程序。 您可以在之前和之后进行一些负载测试,以了解此方法如何影响您的应用。
从数据库服务器端
首先让我说,我不认为数据库服务器上的死锁可以完全防止,只是最小化和适当处理。 我在TechNet上为您找到了此参考 - 最小化死锁。 该页面的第一句话:
尽管无法完全避免死锁,但遵循特定的编码约定可以最大限度地减少产生死锁的机会。
以下是该参考文献的要点。 他们会对每个主题进行更详细的介绍,所以请阅读原始资料。
最小化死锁可以提高事务吞吐量并减少系统开销,因为更少的事务是:
为了帮助减少死锁:
“基于行版本化的隔离级别”可能会回答你的问题或者有没有办法让SQL Server锁定一个行而不是一个表? 有关此选项的原始来源中提到了一些注释。
以下是我搜索过程中出现的其他一些参考资料:
通过使用NOLOCK提示避免死锁
如何避免sql死锁?
提示避免死锁? - 这个提到在使用NOLOCK
提示时要小心。
僵局的困难
使用基于行版本控制的隔离级别
链接地址: http://www.djcxy.com/p/77869.html