Nhận các giao dịch thất bại hoặc không bao giờ được cam kết


Câu trả lời:


5

Không, SQL Server không duy trì bất kỳ lịch sử nào về các giao dịch bị hủy bỏ / khôi phục lại không đáng kể và không đưa ra các vấn đề tiềm ẩn bổ sung (như được nêu trong câu trả lời của @ ooutwire ). Hoặc thậm chí các giao dịch đã được cam kết.

Bạn sẽ phải thực hiện ghi nhật ký của riêng mình trong quá trình xử lý lỗi của bạn hoặc nắm bắt các sự kiện liên quan đến giao dịch cụ thể bằng cách sử dụng theo dõi phía máy chủ hoặc Sự kiện mở rộng.

Dấu vết:

nhập mô tả hình ảnh ở đây

Các sự kiện mở rộng:

nhập mô tả hình ảnh ở đây


Chắc chắn là có, chúng nằm trong tệp nhật ký và tệp sao lưu nhật ký.
ooutwire

1
@ooutwire và làm thế nào để bạn có được những thứ đó một cách dễ dàng? Và làm thế nào để bạn nhận được chúng nếu chúng không còn trong nhật ký? Những hồ sơ đăng nhập là thoáng qua tốt nhất.
Aaron Bertrand

Xem câu trả lời của tôi. Cách tốt nhất là tạo bản sao lưu nhật ký thường xuyên. Tôi đồng ý rằng một giải pháp như vậy là không lý tưởng; nhưng tôi thấy không có lý do tại sao tôi sẽ tìm kiếm mọi lúc trong prod cho các giao dịch bị hủy bỏ. Nếu đó là mong muốn, hơn một dấu vết hoặc XEvent dường như là giải pháp thận trọng.
ooutwire

2
Tôi thấy câu trả lời của bạn, tất nhiên. Tôi nói dễ dàng và cũng nên nói một cách đáng tin cậy . :-)
Aaron Bertrand

6
Tôi với @AaronBertrand về điều này. Với những rắc rối sẽ phải xử lý thông qua nhật ký giao dịch ( Lưu ý: không phải là mục đích của chúng ), bạn cũng có thể tạo một phiên XE nhẹ để khắc phục sự cố này.
Thomas Stringer

4

Khi bạn nói các giao dịch "thất bại", ý bạn chính xác là gì?

Nếu bạn muốn xem các giao dịch hiện tại trên ví dụ, bạn có thể sử dụng sys.dm_tran_active_transactionsDMV.

Ngoài ra, sys.dm_exec_sessionsopen_transaction_countthể cung cấp cho bạn thông tin này theo phiên. Dưới đây là truy vấn chẩn đoán để kéo tất cả các quy trình người dùng có giao dịch mở:

select 
    s.session_id,
    s.login_name,
    s.open_transaction_count,
    st.text as most_recent_sql_text
from sys.dm_exec_sessions s
inner join sys.dm_exec_connections c
on s.session_id = c.session_id
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) st
where s.is_user_process = 1
and s.open_transaction_count > 0;

Thông tin này cũng có thể được lấy từ sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

Nếu bạn muốn nắm bắt khi các giao dịch được khôi phục (giả sử rất nhiều bởi mong muốn của bạn đối với các giao dịch "không thành công"), bạn có thể nắm bắt sự kiện Mở rộng rollback_tran_completed. Nếu bạn đang tìm kiếm giao diện "mọi thứ" cho các giao dịch, bạn có thể nắm bắt sql_transactionsự kiện, như được xác định bởi SQL Server là

Xảy ra khi một giao dịch SQL Server bắt đầu, hoàn thành, khôi phục hoặc thực hiện một điểm lưu trữ. Sử dụng sự kiện này để theo dõi hành vi giao dịch khi xử lý sự cố ứng dụng, kích hoạt hoặc thủ tục được lưu trữ.


4

Bạn có thể sử dụng fn_dblog () và tìm ID giao dịch cho các giao dịch bị hủy bỏ cũng như một loạt các thông tin hữu ích khác.

LỰA CHỌN * 
TỪ fn_dblog (NULL, NULL)
Hoạt động WHERE = 'LOP_ABORT_XACT';
ĐI

Nó quét tất cả nhật ký giao dịch trong phần hoạt động của nhật ký. Điều này có thể được sử dụng quá mức khi sử dụng cờ theo dõi 2537, điều này sẽ cho phép bạn quay trở lại càng xa càng tốt để bắt đầu VLF "không sử dụng lại" lâu đời nhất. Hãy cẩn thận khi sử dụng chức năng này, vì nó quét nhật ký ngẫu nhiên và nhật ký không thể thay đổi khi quá trình quét đang diễn ra; vì vậy, bạn có thể thấy tăng trưởng log.

Bạn cũng có thể sử dụng fn_dump_dblog đối với tệp sao lưu nhật ký.

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.