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