我要開始說我非常確定這是不可能的。谷歌搜索沒有提出任何人提出這個問題,所以我悲觀的希望。確定SqlTransaction是否寫入數據或只讀
我使用的SqlTransaction連接到數據庫,並允許一些消費者之前,我關閉它使用此事務。是否可以確定事務是否僅用於讀取數據或讀取/寫入數據,即使存儲過程可能已被使用?是否存在可以檢查這個屬性或SQL方法(除了執行一些不方便的diff)?
我要開始說我非常確定這是不可能的。谷歌搜索沒有提出任何人提出這個問題,所以我悲觀的希望。確定SqlTransaction是否寫入數據或只讀
我使用的SqlTransaction連接到數據庫,並允許一些消費者之前,我關閉它使用此事務。是否可以確定事務是否僅用於讀取數據或讀取/寫入數據,即使存儲過程可能已被使用?是否存在可以檢查這個屬性或SQL方法(除了執行一些不方便的diff)?
sys.dm_exec_sessions有一列writes
。你可以這樣查詢:
SELECT writes FROM sys.dm_exec_sessions WHERE session_id = @@SPID
雖然這會帶來一些開銷。我認爲DMV在運行的會話數量上是O(N)
。系統會減慢更多的會話。最終它成爲負面縮放的情況。
請注意,這是一個每個會話的價值。如果每個會話有多個事務(每個對象開放一個SqlConnection
),寫入將被累積跟蹤。你需要解釋這一點,或者在另一個答案中使用這個想法。
嗯,This is only an idea
。我的想法是這樣..建立在你的數據庫中的表,要求CountRead
,和另一個表CountWrite
,然後修改querys中讀出表寫如果查詢是一個SELECT和寫入用表,如果查詢是一個插入或什麼。然後,當你想檢查是否只讀或寫,你只需要讀這些表(如果他們已經有數據,你可以或者當你的應用程序啓動時刪除所有的數據,或在開始時檢查計數)。
然後用一個簡單的SELECT這個表,你將能夠檢查是否只讀querys已經使用,或只寫querys,或兩者兼而有之,多少次。
正如我所說,只是一個想法。 ;)我希望這可以幫助,或至少給你一些想法如何去做
您可以使用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,以便返回活動會話的日誌大小。
我也懷疑這可以做到,但這是一個有趣的問題。 +1 – Heinzi
這有什麼意圖? – usr
幾個,其實。首先是錯誤記錄,perf分析是另一個。但實際上這是一個普遍的問題,如果可能的話,它會有很多用例。 – Tyrsius