Jika suatu transaksi “dilakukan”, apakah kemudian disimpan dengan pasti?

12

Jika suatu transaksi berhasil dilakukan , dapatkah saya 100% yakin bahwa transaksi itu telah ditulis ke database DAN ke file log? Bisakah saya yakin bahwa data tersebut DISIMPAN?

Hari ini file log kami telah mencapai batas drive dan kami mendapat banyak kesalahan. Selain itu, beberapa layanan lain macet. Kami menambah disk dan memulai ulang server.

Saat startup, server melakukan "pemulihan basis data" - dapatkah saya yakin semuanya baik-baik saja?

Polisi SQL
sumber
2
Anda dapat memeriksa log kesalahan setelah pemulihan selesai untuk melihat berapa banyak transaksi yang dilakukan dan berapa banyak yang dibatalkan. Tidak ada jawaban ajaib untuk ini - jika disk jatuh maka itu semua tergantung pada keadaan transaksi pada saat itu.
Aaron Bertrand
1
@ AaronBertrand Tetapi jika suatu transaksi dalam keadaan "berkomitmen" (mis. Komit berhasil), bagaimana mungkin ia masih hilang selama pemulihan?
SQL Police
3
@ Giosco: Tidak bisa. "berkomitmen" berarti ada di file log basis data. Satu-satunya cara untuk kehilangan setelah itu adalah 1) kehilangan file log sebelum juga disimpan ke file data, atau 2) kehilangan file log dan file data, atau 3) kesalahan manusia. Perhatikan bahwa (3) biasanya yang paling mungkin.
RBarryYoung
2
@ Giosco, bagaimana Anda tahu bahwa semua transaksi Anda pada saat drive penuh berhasil dilakukan?
Aaron Bertrand
2
Prosedur tersimpan <> transaksi - prosedur tersimpan Anda dapat memiliki beberapa transaksi eksplisit, atau hanya implisit, mungkin ada logika coba-coba, mungkin ada penanganan transaksi di lapisan C #, dll. Lagi, dengan asumsi bahwa tidak ada pengecualian = komit berhasil mungkin sedikit terlalu berbahaya sebagai pernyataan selimut.
Aaron Bertrand

Jawaban:

16

Jika aplikasi klien telah mengeluarkan COMMIT dan mendapatkan kembali kode sukses maka transaksi dijamin oleh mesin menjadi tahan lama. Dijamin bahwa semua perubahan yang dilakukan dalam transaksi akan terlihat, bahkan setelah crash. Selain itu pemulihan juga menjamin bahwa setiap transaksi yang tidak dilakukan akan dibatalkan jika terjadi kerusakan.

Untuk lebih jelasnya saya sarankan membaca kertas ARIES .

Logging dan pemulihan Write-depan tidak dapat membuat jaminan jika perangkat keras penyimpanan yang mendasari memiliki kesalahan (korupsi). Dan produk rekayasa apa pun mungkin mengandung cacat.

Aplikasi Anda, seperti semua aplikasi lain, harus ditulis dengan hati-hati agar berperilaku dengan benar di hadapan crash (kesalahan). Tidak ada sihir.

Remus Rusanu
sumber
Jika aplikasi klien telah mengeluarkan COMMIT tetapi tidak ada tanggapan dari DB diterima sampai batas waktu di sisi klien. Bagaimana dengan komitmen ini? sukses atau gagal? Bagaimana cara mengeceknya?
Gab 是 好人