【问题标题】:TinyTDS timeout and deadlocks a LOTTinyTDS 超时和死锁很多
【发布时间】:2015-05-03 06:43:37
【问题描述】:

我有一个相对较大的系统运行 Rails 和 TinyTds(使用 FreeTds 的 SQLServer 数据库适配器)。问题是我每天收到大约 200 封电子邮件,说我的请求超时或死锁。

[Exception] application#index (ActionView::Template::Error) "TinyTds::Error: Adaptive Server connection timed out: EXEC sp_executesql

它们总是发生在不同的动作上。

A ActiveRecord::DeadlockVictim occurred in transportes#importacao:

  TinyTds::Error: Transaction (Process ID 276) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

我不知道为什么它会超时这么多,并且已经在这些电子邮件中苦苦挣扎了将近 2 个月。 我已经尝试更新 gem 版本,FreeTds 的 linux 二进制文件,但没有任何帮助。

目前使用 Ruby 1.9.3-p484、Rails 3.2.16 和 TinyTds 0.6.2

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 您将不得不查看 sql server 并查看发生了什么。您的查询/进程都在不同事务中竞争同一个表。
  • 我有大约 200 人登录我的系统,同时与 30 个不同的表进行交互。对于所有这些,我打开事务以在数据库上做一些事情。他们每个人都有自己的交易。这不应该是一个问题。你通常不会更新同一行,或删除正在更新的行。关于我必须如何在 SQLServer 上搜索怪异的任何想法?
  • 不确定超时,它们总是发生在相同的查询上吗?或任何模式?或者还有什么你能辨别的?服务器调试(mssql 和 rails 方面,但主要是 mssql)可能会有所帮助。但也可以在这里查看github.com/rails-sqlserver/activerecord-sqlserver-adapter/wiki/… 关于 database.yml 与 freetds.conf 中的超时选项。你有任何一套吗?
  • 不错。可能是两者的结合,但很可能是超时。

标签: ruby-on-rails ruby-on-rails-3 freetds tiny-tds


【解决方案1】:

我建议你几个可以尝试的选项..

  • 默认情况下,数据库引擎选择运行回滚成本最低的事务的会话作为死锁牺牲品。或者,用户可以使用 SET DEADLOCK_PRIORITY 语句指定死锁情况下会话的优先级。 DEADLOCK_PRIORITY 可以设置为 LOW、NORMAL 或 HIGH,或者可以设置为范围内的任何整数值(-10 到 10)。
  • 自定义锁定超时,当 Microsoft SQL Server 数据库引擎的一个实例由于另一个事务已经拥有资源上的冲突锁定而无法向事务授予锁定时,第一个事务将被阻塞,等待现有的锁被释放。默认情况下,没有强制超时期限,也没有办法在锁定资源之前测试资源是否被锁定,除非尝试访问数据(并可能被无限期阻止)。

以下示例将锁定超时时间设置为 1800 毫秒。

SET LOCK_TIMEOUT 1800;
GO
  • 索引数:我们应该确定增加或减少索引是否会改善死锁。如果大部分时间都在进行表扫描,则需要额外的索引。此外,如果存在未在查询计划中用于任何查询的不需要的索引,并且这些不必要的索引需要在每个 INSERT、UPDATE 和 DELETE 语句期间更新,则需要更少的索引,这会增加这些语句的执行时间,这也增加死锁的机会。

【讨论】:

    猜你喜欢
    • 2015-09-20
    • 2018-05-12
    • 2015-02-16
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多