2010-07-26 102 views
2

我試圖用NHibernate保存對象圖。由於非空約束衝突,保存失敗。SQL Server - 表似乎被阻止

我現在發現數據庫中與圖形中某個對象相對應的表現在似乎被鎖定。我無法查詢它。每當我嘗試,它只是坐在那裏無所事事,直到我取消查詢。大約半個小時的情況就是如此。

在保存代碼中,事務首先被提交併處理。

SELECT @@ TRANCOUNT對數據庫給出0

任何想法一)這是怎麼回事,和b)怎樣才能表背?

回答

3

@@TRANCOUNT的作用域爲current connection

假設您在服務器上擁有足夠的權限。

select hostname,program_name, spid,text from master.sys.sysprocesses 
outer apply sys.dm_exec_sql_text(sql_handle) s 
WHERE open_tran>0 

給出了與當前打開的事務以及該連接執行的最後文本的任何連接。我使用sysprocesses的原因是here

如果上面的查詢顯示您的罪魁禍首,那麼你可以得到SPID和使用kill <spidnumber>來毫不客氣地把它卷back.You可能要考慮設置在XACT_ABORT爲將來的查詢,以便錯誤不會離開交易開放。

+0

無效的對象名稱'sysprocesses'。它的模式是什麼? – David 2010-07-26 15:54:38

+0

對於SQL2005 +它在'sys'模式中,但'sys'對於向後兼容是可選的,所以聽起來像你沒有權限查看它。你能在你的應用程序端做些什麼來關閉連接嗎?你也有@ DOK的建議類似的問題? – 2010-07-26 15:56:05

+0

如果我不能查看它,沒有人可以!這是我的數據庫...... DOK的建議沒有問題。 – David 2010-07-26 16:00:46

0

如果您有權訪問數據庫,請嘗試運行sp_lock以查看誰鎖定了表。

編輯:這將返回幾列記錄信息描述here。其中一列是spid。您可以使用sp_who(或sp_who2)查看誰已登錄,並查找持有鎖的spid

如果您有「查看服務器狀態」權限,則還可以使用sys.dm_tran_locks

+0

sp_lock告訴我我有兩個KEY鎖,一個PAG鎖和一個TAB鎖。我如何知道用戶是誰?我該如何取出鎖? – David 2010-07-26 15:59:16

0

你確定你已妥善處理你的會話嗎?這通常是這類問題的原因...

0

嘗試運行此:

SELECT 
    r.session_id AS spid 
     ,r.cpu_time,r.reads,r.writes,r.logical_reads 
     ,r.blocking_session_id AS BlockingSPID 
     ,LEFT(OBJECT_NAME(st.objectid, st.dbid),50) AS ShortObjectName 
     ,LEFT(DB_NAME(r.database_id),50) AS DatabaseName 
     ,s.program_name 
     ,s.login_name 
     ,OBJECT_NAME(st.objectid, st.dbid) AS ObjectName 
     ,SUBSTRING(st.text, (r.statement_start_offset/2)+1,((CASE r.statement_end_offset 
                    WHEN -1 THEN DATALENGTH(st.text) 
                    ELSE r.statement_end_offset 
                   END - r.statement_start_offset 
                  )/2 
                  ) + 1 
       ) AS SQLText 
    FROM sys.dm_exec_requests       r 
     JOIN sys.dm_exec_sessions      s ON r.session_id = s.session_id 
     CROSS APPLY sys.dm_exec_sql_text (sql_handle) st 
    WHERE [email protected]@SPID 

它會告訴你誰是阻止您的查詢

+0

對不起,這不會返回任何行! – David 2010-07-26 19:44:38

+0

然後在該數據庫上沒有任何活動,刪除'WHERE',你會看到這個實際查詢的行。打開多個SSMS窗口,在一個窗口中運行緩慢的查詢,然後快速切換到此窗口並運行此查詢,您可以查看行,然後 – 2010-07-26 20:23:40

0

無論任何其他特定DB-的行爲,你應該回滾交易後立即發生錯誤。這不應該留下任何鎖定。

+0

我已經(作爲開發人員)使用數據庫工作了多年,並且我一直認爲事務已滾動如果數據庫錯誤,則自動回退有趣的時間來發現我是多麼的錯! – David 2010-07-26 18:45:40

+0

謝謝迭戈。我已經相應地更新了我的存儲庫代碼,現在數據庫錯誤後表格沒有被鎖定。 – David 2010-07-26 20:00:05