SQL 伺服器:交易管理

管理 SQL Server 交易是確保作業順利,以及防止鎖定和封鎖錯誤的重要步驟。

摘自"SQL 伺服器 DMV 初學者包"紅門書 (2010 年) 發表。

Glenn Berry, Louis Davidson 和 Tim Ford

展望精確的管理操作,SQL Server 時,要仔細考慮您如何管理與事務有關的動態管理物件 (DMOs)。 所有的旅遊景點管理組織"事務相關"類別中的動態管理視圖 (Dmv) 開頭"sys.dm_tran_"作為開場白。

最終,針對 SQL Server 執行的每個語句是事務性的。 如果您發出一條 SQL 語句,隱式事務啟動下蓋。 此語句將啟動和自動完成。 如果您使用顯式開始陳德 / 提交陳德命令,您可以組合這些在一起作為顯式事務 — — 一組語句必須失敗或共同成功。

SQL Server 實現各項事務隔離級別,以確保這些事務的原子性、 一致性、 隔離和耐久性 (酸) 屬性。 在實際情況下,這意味著它使用鎖和鎖閂,使調解事務性訪問共用的資料庫資源,防止事務之間的"干擾"。

一般來說,您的策略和流程調查和管理 SQL Server 事務將被限制在幾個關鍵問題:

  • 什麼事務處於活動狀態,和什麼會話正在運行它們嗎? (session_transactions,active_transactions)
  • 哪些交易做最多的工作? () database_transactions
  • 哪些事務鎖定阻塞問題的根源? (鎖定)

基於這些原因,調查鎖定和阻塞的是到目前為止最常用的這些 Dmv。 調查將繼續變得越來越普遍,面積到生成時使用快照隔離級別的活動。 在 SQL Server 2005 實施了快照隔離級別。 快照隔離可消除阻塞和鎖死使用版本存儲在 tempdb 資料庫中的維護併發性,而不是建立資料庫物件上的鎖。 有大量的 Dmv 提供調查此隔離級別。

顯示器長時間運行的事務

現在讓我來的腳本。 除非另有說明,所有這些查詢使用 SQL Server 2005 中,2008 年和 2008 R2,和所有需要查看伺服器狀態的許可權。 此腳本使用兩個 Dmv。 第一個是 sys.dm_tran_database_transactions,所述連線 SQL Server 叢書 (平原) 中,如下所示:返回有關在資料庫級別的事務的資訊。

第二個是 sys.dm_tran_session_transactions,這只是:返回關聯的交易和會話的相關資訊。

給 database_transactions,而是掩蓋其潛在用途的簡短說明。 下麵的腳本提供了查詢,顯示每個會話,哪些資料庫由一個打開的事務使用由該會話,是否該事務已升級到中的任何資料庫的讀寫 (預設情況下多數交易是唯讀),當事務升級到該資料庫、 多少日誌記錄寫入,和這些日誌記錄的名義用多少位元組讀寫:

選擇 st.session_id、 DB_NAME(dt.database_id) 為 database_name,dt.database_transaction_begin_time 時的情況下為空則唯讀

ELSE ' 讀寫 ' 年底為 transaction_state、 read_write_start_time、 dt.database_transaction_log_record_count、 dt.database_transaction_log_bytes_usedFROM sys.dm_tran_session_transactions 作為 st INNER JOIN sys.dm_tran_database_transactions dt.database_transaction_begin_time 作為 dt

對 st.transaction_id = dt.transaction_idORDER 的 st.session_id、 database_name

諸如此類的針對 database_transactions 的查詢是非常有用的例如監視的事情時:

  • 打開 (特別是重要的睡覺的會話) 的讀寫事務的會話
  • 會話導致事務日誌增長/膨脹
  • 長時間運行的事務的進展 (非大量投寄記錄的操作,為每個受影響的索引行會產生大約一個事務日誌記錄)

鎖定和阻塞

Dmv 事務相關類別的示例腳本使用 sys.dm_tran_locks 汽車登記處,所述的平原,如下所示:

"資源管理器返回有關當前處於活動狀態的鎖的資訊。 每行表示當前處於活動狀態的請求已被授予或正在等待被授予鎖管理器。 在結果集中的列可分為兩大類:資源和請求。 資源組描述的資源的鎖請求操作正在進行,並且,請求組說明鎖請求。"

此 DMV 是助找出您的資料庫實例上的鎖定和阻塞問題很有用:

— — 看看當前的資料庫活動鎖管理器資源

選擇 request_session_id,

DB_NAME(resource_database_id) 作為 [資料庫],resource_type,resource_subtype,request_type,request_mode,resource_description,request_mode request_owner_type

從 sys.dm_tran_locksWHERE request_session_id > 50、 Resource_database_id = db_id () 和 request_session_id < > @ @ SPIDORDER 的 request_session_id ;

— — 尋找阻止

選擇 tl.resource_type、 tl.resource_database_id、 tl.resource_associated_entity_id、 tl.request_mode、 tl.request_session_id、 wt.blocking_session_id、 wt.wait_type、 wt.wait_duration_msFROM sys.dm_tran_locks 作為 tl INNER JOIN sys.dm_os_waiting_tasks 作為 wt 對 tl.lock_owner_address = wt.resource_addressORDER BY wait_duration_ms DESC ;

第一個查詢顯示鎖類型和他們的 SPID,篩選當前資料庫中,並消除了當前連接和系統 Spid 的地位。 第二個查詢提供有關任何阻塞的資訊可能會發生的實例級。 請注意這第二個查詢加入 sys.dm_os_waiting_tasks 登記處獲取資料的進程在等待,封閉,時間長度和哪些資源。

除非您有嚴重阻塞的問題,您通常需要運行每個查詢多次追堵。 如果你不找到兩個數據修改語句,或者查詢和資料修改操作,而包羅萬象的嚴重阻塞,或甚至鎖死,那麼你需要查詢的 SQL 文本中提取,檢查它們,運行這些測試系統上 — — 與事件探查器跟蹤運行 — — 並找出一個方法來優化查詢,或添加索引,以紓緩問題。

Glenn Berry

Glenn Berry 在科羅拉多州丹佛 NewsGator 技術工程為數據庫建築師 他是 SQL 伺服器 MVP,並且具有微軟認證,包括 MCITP、 MCDBA、 MCSE、 MCSD、 MCAD 和攤檔,這證明了他喜歡參加測試的整個集合。

Louis Davidson

Louis Davidson 一直在 IT 業 16 年為公司的資料庫開發人員和架構師。 他了六年的 SQL 伺服器的 Microsoft MVP,並寫了四本書對資料庫的設計。 目前他是資料架構師和有時對於基督教廣播網路,支援辦事處在佛吉尼亞海灘,弗吉尼亞州和田納西州納什維爾,DBA

Timothy Ford

Tim Ford SQL 伺服器 MVP,一直與 SQL Server 超過 10 年。 他是主 DBA 和 SQL Server 平臺譜健康主題專家。 他曾是自 2007 年以來為 Web 網站的各種技術寫作並維護自己在博客上的 thesqlagentman.com,以及辦公和專業發展主題涵蓋 SQL。

瞭解更多有關"SQL 伺服器 DMV 初學者包"在 red-gate.com/our-company/about/book-store

相關的內容