Saya sering melihat pernyataan seperti catatan log server sql setiap transksi dan opeation.
Tapi saya bingung tentang apa yang terjadi ketika transaksi akhirnya digulung kembali .
Katakanlah transaksi eksplisit memiliki 3 pernyataan: statement A
, statement B
, statement C
, dan akhirnya rollback
statement D
.
Sekarang katakan ketika eksekusi belum mencapai rollback statement D
, akankah modifikasi yang dihasilkan dari statements A through C
dicatat ke log server sql?
Memahami 1 :
Pernyataan A sampai D semuanya direkam. SQL Server merekam semuanya, apa pun yang terjadi.
Memahami 2 : Modifikasi hanya disimpan di suatu tempat dalam memori, dan hanya direkam untuk dicatat ketika SQL Server melihat commit
pernyataan. Jika ternyata menjadi rollback
pernyataan, SQL Server mengabaikan transacrion, tidak ada penulisan yang terjadi karena tidak ada tujuan. Dengan kata lain, SQL Server mencatat kapan ada hasil bersih sebelum dan sesudah transaksi.
Keduanya tampak logis, setidaknya bagi saya tetapi keduanya tidak benar. Terima kasih atas bantuannya.
sumber
Jawaban:
Memahami 1 benar. SQL Server mencatat setiap operasi yang mengubah data ke log transaksi. Kembalikan adalah perubahan data sehingga juga mencatat itu ke log transaksi juga. Sebagai pernyataan A jalankan itu akan menulis data ke log transaksi dan juga akan memesan data dalam log transaksi jika pernyataan A perlu digulirkan kembali. Hal yang sama berlaku untuk B dan C. Ketika Anda mengembalikan transaksi, informasi lebih lanjut akan ditulis ke log.
Ada banyak cara untuk melihat ini dalam aksi jadi di bawah ini adalah demo cepat. Berikut adalah kueri yang akan saya gunakan untuk melihat apa yang ditulis ke log:
Meja saya:
Kueri A menggunakan pencatatan minimum:
Setelah:
Kueri B tidak menggunakan pencatatan minimum:
Setelah B:
Kueri C mengubah lebih sedikit data:
Setelah C:
Sekarang saya akan mengeluarkan
ROLLBACK
dan meminta DMV sementara rollback terjadi. Di bawah ini adalah tabel dari beberapa foto:Selama
ROLLBACK
, byte yang digunakan meningkat dan jumlah byte yang dipesan berkurang. Itu karena SQL Server menggunakan ruang yang disisihkan sebelumnya untuk membatalkan transaksi. Untuk membatalkan transaksi itu harus mengubah data sehingga menulis lebih banyak data ke log.sumber
Modifikasi ke tabel database ditulis pertama kali ke file log, kemudian ke tabel itu sendiri, pertama dalam memori dan kemudian, dengan proses asinkron yang disebut
CHECKPOINT
, ke disk. Mekanisme ini dikenal sebagai WAL (Write-Ahead Logging) dan umum untuk semua database relasional.Log itu sendiri pertama kali ditulis ke memori (ke buffer log, tepatnya) dan kemudian ke disk, tetapi tidak ada yang tersentuh pada tabel database sampai log telah ditulis ke disk.
Mekanisme ini memungkinkan pengguliran ke depan untuk transaksi yang dilakukan dan untuk memutar kembali ke beberapa transaksi yang tidak berkomitmen selama proses pemulihan. Mengenai contoh Anda, jika sesuatu yang buruk terjadi setelah
statement C
dan Anda memilikicommit
alih - alihrollback
(Anda tidak dapat mengetahui hal ini sebelumnya), tanpa menyimpan setiap langkah dalam transaksi, RDBMS tidak akan memiliki cara untuk memulihkan database secara konsisten cara dan transaksi tidak akan memenuhiD
(daya tahan) diACID
.Ketika beberapa operasi dibatalkan, itu adalah file data yang menerima perubahan bersih (via
CHECKPOINT
), bukan file log.sumber
Memahami 1 adalah benar, dan spaghettidba dan Joe memiliki penjelasan yang bagus.
Jika Anda tertarik menguji sendiri (pada contoh uji coba), Anda dapat menggunakan skrip di bawah ini:
Anda akan melihat bahwa SQL Server merekam semuanya, bahkan langkah-langkah yang diambil untuk membatalkan operasi.
sumber