2014-03-18 20 views
4

我要開始說我非常確定這是不可能的。谷歌搜索沒有提出任何人提出這個問題,所以我悲觀的希望。確定SqlTransaction是否寫入數據或只讀

我使用的SqlTransaction連接到數據庫,並允許一些消費者之前,我關閉它使用此事務。是否可以確定事務是否僅用於讀取數據或讀取/寫入數據,即使存儲過程可能已被使用?是否存在可以檢查這個屬性或SQL方法(除了執行一些不方便的diff)?

+0

我也懷疑這可以做到,但這是一個有趣的問題。 +1 – Heinzi

+0

這有什麼意圖? – usr

+0

幾個,其實。首先是錯誤記錄,perf分析是另一個。但實際上這是一個普遍的問題,如果可能的話,它會有很多用例。 – Tyrsius

回答

3

sys.dm_exec_sessions有一列writes。你可以這樣查詢:

SELECT writes FROM sys.dm_exec_sessions WHERE session_id = @@SPID 

雖然這會帶來一些開銷。我認爲DMV在運行的會話數量上是O(N)。系統會減慢更多的會話。最終它成爲負面縮放的情況。

請注意,這是一個每個會話的價值。如果每個會話有多個事務(每個對象開放一個SqlConnection),寫入將被累積跟蹤。你需要解釋這一點,或者在另一個答案中使用這個想法。

+0

你能解釋一下這個和Jiggs的區別嗎? – Tyrsius

+1

@Tyrsius我不確定兩種不同的技術是否會檢測到不同類型的寫入,或者它們是否相同。如果他們產生相同的結果,我認爲這是可能的,選擇一個更簡單,更快的結果。這可能是會話編寫欄。 – usr

+0

如果您使用我的初始事務方案進行測試,在向我的測試表中插入一行後寫入= 0。 – JiggsJedi

0

嗯,This is only an idea。我的想法是這樣..建立在你的數據庫中的表,要求CountRead,和另一個表CountWrite,然後修改querys中讀出表寫如果查詢是一個SELECT和寫入用表,如果查詢是一個插入或什麼。然後,當你想檢查是否只讀或寫,你只需要讀這些表(如果他們已經有數據,你可以或者當你的應用程序啓動時刪除所有的數據,或在開始時檢查計數)。

然後用一個簡單的SELECT這個表,你將能夠檢查是否只讀querys已經使用,或只寫querys,或兩者兼而有之,多少次。

正如我所說,只是一個想法。 ;)我希望這可以幫助,或至少給你一些想法如何去做

+0

該解決方案可以工作,但它依賴於所有消費者的協調。如果一些頑皮的存儲過程忘記更新,那麼它會錯誤地報告一個只讀操作。 – Tyrsius

+0

正如我所說,只是一個想法,試圖幫助:)但你是對的@Tyrsius –

+0

哦,是的,想法是值得歡迎的。我只是評論=) – Tyrsius

2

您可以使用sys.dm_視圖來檢查事務狀態。

當一個事務被打開,但沒有做功(只能選擇),它沒有註冊,但如果你做任何工作,事務日誌大小增加。

試試這個......請注意你的SPID。

USE tempdb 
begin tran 
create table dave (id int) 
insert into dave (id) select 1 
-- rollback tran 

離開事務打開,然後看它這個(更換您的SPID):

select database_transaction_log_bytes_used, * 
from sys.dm_tran_database_transactions dt 
inner join sys.dm_tran_active_transactions at on (at.transaction_id = dt.transaction_id) 
inner join sys.dm_tran_session_transactions st on (st.transaction_id = dt.transaction_id) 
where (dt.database_id = DB_ID('tempdb')) and (st.is_user_transaction=1) 
and session_id=83 

然後回滾原件。

那就試試這個:

USE tempdb 
begin tran 
select getdate() 
-- rollback tran 

而且在sys.dm_意見運行上面...

的觀點是空白的,直到有東西記錄在事務。選擇不記錄。

不要忘了把它全部滾回去。

因此,如果您知道spid(易於查詢SELECT @@SPID),那麼您可以在關閉事務之前編寫一個可以查詢的proc/view,以便返回活動會話的日誌大小。

相關問題