2012-07-04 72 views
3

幾個問題dm_exec_sessions。當我運行查詢瞭解SQL Server中的sys.dm_exec_sessions

select * from sys.dm_exec_sessions 

它讓我看到其他列的statustransaction_isolation_level之列。

據我的理解,sys.dm_exec_sessions每個認證會話返回一行。根據我的理解,可以使用此會話運行幾個查詢/事務。

  1. 每個會話返回的transaction_isolation_level是什麼意思?它是使用該連接在數據庫上運行的最後一個事務的隔離級別嗎?

  2. 有一些(幾個)會話具有睡眠狀態。那是什麼意思?我們應該爲此擔心嗎?來自Web服務器的這些事務是否無法回滾?

+1

這屬於對數據庫管理員SE。標記爲遷移。 – 2012-07-04 20:07:01

回答

4

在我的理解幾個查詢/交易可以使用這個 會話中運行。

這是不正確的。您將始終能夠執行至多一個查詢,並且在一個會話中最多隻有一個用戶活動事務,而不會超過一個。

A 連接可以有多個會話,但這是一個不同的故事。 sys.dm_exec_connections

如果您發現SERIALIZABLE會和你想知道爲什麼的話,記得using new TransactionScope() Is Considered Harmful

+1

是的。我們確實有一些可序列化的事務,但其中大部分都是讀取提交的。感謝您澄清連接vs會話。如果每個查詢*創建會話*,那麼狀態爲「睡眠」的會話意味着查詢已發出,會話仍在等待結果? – user275157

+1

不是每個查詢都會創建一個會話。會話在連接登錄時創建。會話會一個接一個地運行多個請求['sys.dm_exec_requests'](http://msdn.microsoft.com/zh-cn/library/ms177648.aspx)和一個請求由語句組成,其中一些語句是查詢。正在休眠的會話意味着它沒有當前的請求。考慮你的客戶端代碼,當你打開一個連接,然後你發出一個命令,然後是另一個命令。在兩個命令之間,連接的會話是空閒的,即。 *睡眠*。 –

+0

明白了。如果有許多睡眠連接在同一個sessionid中持續幾天,這意味着打開的連接沒有正確關閉? – user275157

1

會話本身有一個transaction_isolation_level。並且在該會話中運行的批處理/請求將使用該transaction_isolation_level,除非它明確地更改它。

Sleeping的狀態僅表示會話空閒且當前沒有運行批處理/請求。 (I.E.,它正在等待它的客戶端連接發送一條命令來執行)。通常不需要擔心什麼。

的sys.dm_exec_sessions的官方文檔是在這裏:http://msdn.microsoft.com/en-us/library/ms176013.aspx

+0

感謝您澄清。我在結果中看到,我們的Web服務器與isolation_level serializable(4)建立了兩個連接,另一個連接使用了Read committed(2)。這是一樣的爲什麼呢?它是否應該一直使用4或2? – user275157

+1

這取決於爲Web服務器編寫代碼的人。連接和會話可以根據需要設置或更改此設置。 – RBarryYoung