2015-03-02 86 views
0

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

[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个月。 我已经尝试更新宝石版本,FreeTds的Linux二进制文件,没有任何帮助。

目前使用Ruby 1.9.3-P484,Rails的3.2.16和0.6.2 TinyTds

谁能给我就如何解决这一一些见解?

+0

你将不得不看看sql服务器,看看发生了什么。您有查询/进程在不同的事务中争用同一个表。 – Doon 2015-03-05 18:26:33

+0

我约有200人在我的系统上同时登录30个不同的表格。对于他们所有人,我打开交易做数据库上的东西。他们每个人都有自己的交易。这不应该是一个问题。你通常不更新同一行,或者删除正在更新的行。关于如何在SQLServer上搜索奇怪的想法? – renatojf 2015-03-05 18:41:04

+1

可能会帮助https://technet.microsoft.com/en-us/library/ms178104(v=sql.105).aspx – Doon 2015-03-05 18:58:31

回答

1

我建议你,你可以尝试一些选项..

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

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

SET LOCK_TIMEOUT 1800; 
GO 
  • 索引数:我们要确定是否更多或更少的指标将改善僵局。如果大多数时间表扫描正在发生,则需要额外的索引。除此之外,如果不需要的索引存在,而查询计划中没有用于任何查询,则需要更少的索引,并且这些不必要的索引需要在每个INSERT,UPDATE和DELETE语句期间更新,这增加了这些语句的执行时间,这也增加死锁的机会。