2015-03-02 112 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語句期間更新,這增加了這些語句的執行時間,這也增加死鎖的機會。