Câu trả lời:
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:
Các sự kiện mở rộng:
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_transactions
DMV.
Ngoài ra, sys.dm_exec_sessions
có open_transaction_count
thể 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_transaction
sự 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ữ.
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ý.