Dapatkan transaksi yang gagal atau tidak pernah dilakukan

Jawaban:

5

Tidak, SQL Server tidak memiliki riwayat tentang transaksi yang dibatalkan / dibatalkan yang sepele untuk sampai ke dan tidak memperkenalkan potensi masalah tambahan (seperti yang dijabarkan dalam jawaban @ ooutwire ). Atau bahkan transaksi yang sudah dilakukan.

Anda harus melakukan pendataan Anda sendiri dalam penanganan kesalahan Anda, atau menangkap peristiwa terkait transaksi tertentu menggunakan jejak sisi server atau Peristiwa Diperpanjang.

Jejak:

masukkan deskripsi gambar di sini

Peristiwa diperpanjang:

masukkan deskripsi gambar di sini

Aaron Bertrand
sumber
Tentu ya, mereka ada di file log dan file cadangan log.
ooutwire
1
@ ooutwire dan bagaimana Anda mendapatkannya dengan mudah? Dan bagaimana Anda sampai ke mereka jika mereka tidak lagi di log? Catatan log tersebut hanya sementara.
Aaron Bertrand
Lihat jawaban saya. Cara terbaik adalah membuat cadangan log sering. Saya setuju bahwa solusi semacam itu tidak ideal; tetapi saya tidak melihat alasan mengapa saya akan mencari setiap saat untuk mencari transaksi yang dibatalkan. Jika itu adalah keinginan, daripada jejak atau XEvent akan tampak solusi yang bijaksana.
ooutwire
2
Saya melihat jawaban Anda, tentu saja. Saya berkata dengan mudah dan juga seharusnya mengatakan dengan andal . :-)
Aaron Bertrand
6
Saya dengan @AaronBertrand untuk yang ini. Dengan masalah yang diperlukan untuk menyisir log transaksi ( Catatan: bukan apa yang dimaksudkan untuk ) Anda mungkin juga hanya membuat sesi XE ringan untuk pemecahan masalah ini.
Thomas Stringer
4

Ketika Anda mengatakan transaksi "gagal", apa sebenarnya yang Anda maksud?

Jika Anda ingin melihat transaksi saat ini, Anda dapat menggunakan sys.dm_tran_active_transactionsDMV.

Juga, sys.dm_exec_sessionsmemiliki open_transaction_countyang dapat memberi Anda informasi ini dengan sesi. Di bawah ini adalah permintaan diagnostik untuk menarik semua proses pengguna yang memiliki transaksi terbuka:

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;

Informasi ini juga dapat diambil dari sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

Jika Anda ingin menangkap ketika transaksi dibatalkan (dengan asumsi keinginan Anda untuk transaksi "gagal"), Anda dapat menangkap acara Extended Events rollback_tran_completed. Jika Anda mencari tampilan "segalanya" dari transaksi, Anda dapat menangkap sql_transactionperistiwa, yang didefinisikan oleh SQL Server

Terjadi ketika transaksi SQL Server dimulai, menyelesaikan, memutar kembali atau mengeksekusi savepoint. Gunakan acara ini untuk memantau perilaku transaksi saat memecahkan masalah aplikasi, pemicu, atau prosedur tersimpan.

Thomas Stringer
sumber
4

Anda dapat menggunakan fn_dblog () dan menemukan ID transaksi untuk transaksi yang dibatalkan serta sejumlah informasi berguna lainnya.

PILIH * 
DARI fn_dblog (NULL, NULL)
Operasi WHERE = 'LOP_ABORT_XACT';
PERGILAH

Ini memindai semua log transaksi di bagian aktif dari log. Ini dapat ditunggangi menggunakan jejak bendera 2537, yang akan memungkinkan Anda untuk kembali sejauh mungkin ke awal VLF "tidak digunakan kembali" tertua. Berhati-hatilah saat menggunakan fungsi ini, karena memindai log secara acak dan log tidak dapat berubah saat pemindaian terjadi; jadi, Anda mungkin melihat pertumbuhan log.

Anda juga dapat menggunakan fn_dump_dblog terhadap file cadangan log.

ooutwire
sumber