Tại sao có sự khác biệt giữa các DMV giao dịch này trong SQL Server 2008 R2?


7

Khi tôi thực hiện hai truy vấn bên dưới,

SELECT 
    session_id, transaction_id
    FROM sys.dm_tran_session_transactions;

SELECT 
    session_id, request_id, at.transaction_id
    FROM sys.dm_tran_active_transactions at
        JOIN sys.dm_exec_requests r
            ON r.transaction_id = at.transaction_id;

Tôi đã đọc BOL cho cả 12 nhưng không thấy bất kỳ lời giải thích rõ ràng nào về lý do tại sao sự khác biệt sẽ xảy ra.

Tôi nhận được kết quả khác nhau. Truy vấn trước không trả về kết quả, nhưng truy vấn sau trả về các giao dịch đang hoạt động với id phiên và giao dịch. Các request_idlà 0 mà, tôi nghĩ rằng, phương rằng đó là yêu cầu chỉ thực hiện bằng phiên. Ai đó có thể giúp tôi hiểu tại sao có sự khác biệt giữa hai khái niệm tôi đã hỏi ở trên không?

BIÊN TẬP

Tôi chỉ chạy lại các truy vấn và bây giờ tôi nhận được kết quả cho DMV đầu tiên có một kết quả session_idkhông thực sự có trong tập kết quả thứ hai.

Câu trả lời:


6

Dường như sys.dm_tran_session_transactionskhông bao gồm các giao dịch cam kết tự động:

-- No result
SELECT 
    session_id, 
    transaction_id
FROM sys.dm_tran_session_transactions;

Sử dụng một giao dịch rõ ràng sẽ trả về kết quả:

BEGIN TRANSACTION;

    -- Row returned    
    SELECT 
        session_id, 
        transaction_id
    FROM sys.dm_tran_session_transactions;

ROLLBACK TRANSACTION;

DMV là quan điểm về cấu trúc bên trong và tài liệu không thường xuyên toàn diện như trong các lĩnh vực khác. Một số điều đó có thể là do sẽ bất tiện khi trải qua một chu kỳ khấu hao hoàn toàn mỗi khi có sự thay đổi trong hành vi DMV, nhưng rất có thể đó chỉ là sự giám sát trong trường hợp này. Bạn có thể báo cáo sự thiếu hụt tài liệu trên Connect.

Adam Machanic đã tìm thấy tất cả các loại hành vi kỳ quặc với DMV trong khi viết công cụ sp_WhoIsActive của mình . Nếu nó phù hợp với mục đích của bạn, bạn có thể sử dụng nó thay vì cố gắng viết các truy vấn giám sát của riêng bạn.


4

sys.dm_tran_session_transactionslà chế độ xem trung gian cho phép tham gia DMV được xác định chủ yếu trên session_id column- sys.dm_exec*DMV với các sys.dm_tran_*DMV khác . Khung nhìn này sẽ cho biết giao dịch là giao dịch người dùng is_user_transaction= 1 hay giao dịch hệ thống với is_user_transaction= 0.

Mặt khác, sys.dm_tran_active_transactions- là DMV sẽ lưu trữ thông tin giao dịch hiển thị trạng thái, trạng thái của từng giao dịch - được bắt đầu nhưng chưa hoàn thành, nhập, v.v. trên ví dụ máy chủ sql. Nó cũng cung cấp thông tin về các giao dịch phân phối là tốt. DMV này sẽ cung cấp kết quả cho tất cả các cơ sở dữ liệu trên phiên bản máy chủ và đó là ảnh chụp nhanh theo thời gian của các giao dịch hiện đang hoạt động - kết quả sẽ thay đổi mỗi khi truy vấn được thực thi vì sate của giao dịch riêng lẻ sẽ thay đổi.

Tham khảo sys.dm_tran_session_transilitiessys.dm_tran_active_transilities cho danh sách cột và ý nghĩa của từng cột.


Đó là suy nghĩ ban đầu của tôi là tốt. Điều tôi đang hỏi là tại sao phiên_transaction DMV không có cùng thông tin vì phiên đã bắt đầu yêu cầu có giao dịch mở và hoạt động. Về cơ bản, tại sao không phải là giao dịch hoạt động của tôi trong chế độ xem trung gian giao dịch phiên?
swasheck

@swasheck Chỉ tò mò, bạn đang sử dụng dịch vụ môi giới (địa phương hay DTC)? Điều này sẽ hữu ích Cách thức hoạt động: sys.dm_tran_session_transilities ( blog.msdn.com/b/psssql/archive/2012/01/24/ trên ). sys.dm_tran_session_transactionsDMV chỉ xuất các hàng cho (các) phiên KHÔNG phải là phiên cấp hệ thống.
Kin Shah

Không. Không sử dụng dịch vụ môi giới
swasheck

2

Cả hai DMV là một ảnh chụp nhanh về những gì đang xảy ra tại thời điểm chính xác mà chúng được thực thi. Do đó, rất có khả năng trên một hệ thống bận rộn đang chạy

SELECT 
session_id, transaction_id
FROM sys.dm_tran_session_transactions;

SELECT 
session_id, transaction_id
FROM sys.dm_tran_session_transactions;

có thể hiển thị các bộ kết quả khác nhau.


Có khả năng, nhưng không phải là trường hợp ở đây. Cảm ơn. Tôi đã phát hiện ra rằng các giao dịch được phân phối trên cơ sở dữ liệu. Tôi tự hỏi nếu điều đó nên nói với tôi bất cứ điều gì.
swasheck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.