Sql server ColdFusion中防止DB死锁的解决方案?

Sql server ColdFusion中防止DB死锁的解决方案?,sql-server,ajax,coldfusion,cqrs,Sql Server,Ajax,Coldfusion,Cqrs,我正在开发的一个应用程序必须处理大量ajax请求,这些请求需要更新数据库中的一些数据 [Macromedia][SQLServer JDBC驱动程序][SQLServer]事务(进程ID 66)在与的锁通信缓冲区资源上处于死锁状态 另一个进程和已被选为死锁牺牲品。重新运行 交易 对于读取,我已经使用了带有(NOLOCK)提示的,这防止了大量读取死锁 我能做些什么来更好地处理写作 在CF中锁定更新代码 或者有没有办法让SQL Server锁定行而不是表 有人尝试过实施CQR吗?似乎可以解决问题,但

我正在开发的一个应用程序必须处理大量ajax请求,这些请求需要更新数据库中的一些数据

[Macromedia][SQLServer JDBC驱动程序][SQLServer]事务(进程ID 66)在与的锁通信缓冲区资源上处于死锁状态 另一个进程和已被选为死锁牺牲品。重新运行 交易

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

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

在CF中锁定更新代码

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

有人尝试过实施CQR吗?似乎可以解决问题,但我不清楚如何处理:

  • ID生成(现在它在DB上使用自动增量)
  • 如果服务器不能立即将错误发送回客户端,如何处理更新请求失败

  • 谢谢

    以下是我的想法

    从ColdFusion服务器端

    我相信在更新数据库的ColdFusion代码周围使用命名的
    标记可以防止数据库服务器上的死锁问题。使用命名锁将使每个调用都是单线程的。但是,如果事务需要一段时间,您可能会在ColdFusion服务器端遇到超时,等待
    。在ColdFusion服务器端以这种方式处理也可能会降低应用程序的速度。你可以在之前和之后做一些负载测试,看看这个方法是如何影响你的应用的

    从数据库服务器端

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

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

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

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

    • 回滚,撤消事务执行的所有工作
    • 应用程序重新提交,因为它们在死锁时被回滚
    要帮助最小化死锁,请执行以下操作:

    • 以相同的顺序访问对象
    • 避免事务中的用户交互
    • 保持交易简短且集中在一批中
    • 使用较低的隔离级别
    • 使用基于行版本控制的隔离级别。
      • 将READ_COMMITTED_SNAPSHOT database选项设置为ON,以启用READ COMMITTED事务以使用行版本控制
      • 使用快照隔离
    • 使用绑定连接
    “基于行版本控制的隔离级别”可能会回答您的问题,或者是否有办法让SQL Server锁定行而不是表?。原始资料中提到了一些关于此选项的注释

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

    -这一条提到使用
    NOLOCK
    提示时要小心


    我假设您使用的是Microsoft SQL Server,因为标签。你知道用于插入的表是否有聚集索引吗?@ScottJibben唯一的聚集索引是PK。这样就可以了。我发现没有聚集索引的大型表的插入速度会越来越慢。