Apakah praktik yang buruk untuk selalu membuat transaksi?
Sebagai contoh, itu adalah praktik yang baik untuk membuat transaksi hanya untuk yang sederhana SELECT
?
Berapa biaya untuk membuat transaksi padahal sebenarnya tidak perlu?
Bahkan jika Anda menggunakan tingkat isolasi seperti READ UNCOMMITTED
, apakah itu praktik yang buruk?
BEGIN TRAN SELECT ... COMMIT
vs hanyaSELECT
tampaknya ada perbedaan kinerja yang sangat kecil .Jawaban:
Apakah praktik yang buruk selalu membuat transaksi?
Itu tergantung pada konteks apa yang Anda bicarakan di sini. Jika ini merupakan pembaruan, maka saya akan sangat merekomendasikan menggunakan TRANSAKSI secara eksplisit. Jika itu SELECT maka TIDAK (secara eksplisit).
Tapi tunggu dulu ada lagi yang perlu dipahami: Segala sesuatu di server sql terkandung dalam sebuah transaksi.
Ketika opsi sesi
IMPLICIT_TRANSACTIONS
adalahOFF
dan Anda secara eksplisit menentukanbegin tran
dancommit/rollback
kemudian ini umumnya dikenal sebagai Transaksi Eksplisit . Kalau tidak, Anda mendapatkan transaksi autocommit.Ketika
IMPLICIT_TRANSACTIONS
adalahON
sebuah transaksi implisit secara otomatis dimulai ketika menjalankan salah satu jenis pernyataan didokumentasikan dalam buku-buku artikel online (misalnyaSELECT
/UPDATE
/CREATE
) dan harus berkomitmen atau digulung kembali secara eksplisit. Menjalankan aBEGIN TRAN
dalam mode ini akan menambah@@TRANCOUNT
dan memulai transaksi "bersarang" lainnya)Untuk mengganti mode yang Anda gunakan, gunakan
atau
jika di atas mengembalikan 2, Anda berada dalam mode transaksi implisit. Jika mengembalikan 0, Anda berada dalam autocommit.
berapa biaya untuk membuat transaksi padahal sebenarnya tidak perlu?
Diperlukan transaksi untuk membawa basis data dari satu kondisi konsisten ke kondisi konsisten lainnya. Transaksi tidak memiliki biaya karena tidak ada alternatif untuk transaksi. Lihat: Menggunakan Level Isolasi Berbasis Versi Baris
Bahkan jika Anda menggunakan tingkat isolasi read_uncomitted. Apakah praktik yang buruk? karena seharusnya tidak ada masalah dengan penguncian.
READ_UNCOMMITED tingkat isolasi akan memungkinkan pembacaan yang kotor menurut definisi yaitu Satu transaksi akan dapat melihat perubahan yang tidak dikomit dibuat oleh transaksi lainnya. Apa yang dilakukan tingkat isolasi ini adalah, ini melemaskan kepala penguncian - metode memperoleh kunci untuk melindungi konkurensi Database.
Anda dapat menggunakan ini pada tingkat koneksi / kueri, sehingga tidak memengaruhi kueri lain.
Ditemukan sebuah artikel yang menarik oleh Jeff Atwood yang menggambarkan Deadlock karena Dining Philosophers Puzzle dan menjelaskan level isolasi snapshot yang sudah dibaca .
SUNTING:
Karena penasaran, saya melakukan beberapa tes mengukur dampak pada T-log dengan penghitung Perfmon seperti Log Bytes Flushed / Sec, Log Flush Waits / Sec (Jumlah komit per detik yang menunggu LOG flush terjadi) seperti grafik di bawah ini:
Kode sampel :
Transaksi Autocommit : (Diedit seperti yang disorot oleh @TravisGan)
IMPLICIT & Transaksi Eksplisit:
Ada transaksi sys.dm_tran_database_transaksi DMV yang akan mengembalikan informasi tentang Transaksi di tingkat basis data.
Jelas, ini lebih merupakan tes sederhana untuk menunjukkan dampaknya. Faktor-faktor lain seperti subsistem disk, pengaturan pertumbuhan otomatis basis data, ukuran awal basis data, proses lain yang berjalan di server \ database yang sama, dll akan memiliki pengaruh juga.
Dari tes di atas, hampir tidak ada perbedaan antara transaksi Implisit & Eksplisit.
Terima kasih kepada @TravisGan karena telah membantu menambahkan lebih banyak pada jawabannya.
sumber
Pernyataan SQL selalu berjalan dalam transaksi. Jika Anda tidak memulai satu secara eksplisit, setiap pernyataan SQL akan berjalan dalam transaksi itu sendiri.
Satu-satunya pilihan adalah apakah Anda menggabungkan banyak laporan dalam satu transaksi. Transaksi yang menjangkau banyak laporan meninggalkan kunci yang mengganggu konkurensi. Jadi "selalu" membuat transaksi bukanlah ide yang baik. Anda harus menyeimbangkan biaya dengan manfaatnya.
sumber
Masalahnya adalah apakah sekelompok operasi harus diperlakukan sebagai tindakan tunggal. Dengan kata lain semua operasi harus diselesaikan dan dilakukan dengan sukses atau tidak ada operasi yang dapat dilakukan. Jika Anda memiliki skenario yang mengharuskan Anda membaca data awal dan kemudian melakukan pembaruan berdasarkan data itu maka pembacaan awal mungkin harus menjadi bagian dari transaksi. Catatan: Saya menghindari Select / Insert / Update sengaja. Cakupan transaksi sebenarnya mungkin pada tingkat aplikasi dan melibatkan beberapa operasi database. Pikirkan pola-pola klasik seperti Reservasi Kursi Pesawat atau Penarikan / Penarikan Saldo Bank. Seseorang harus mengambil pandangan yang lebih luas dari masalah untuk memastikan seluruh aplikasi menghasilkan data yang konsisten dan dapat diandalkan.
sumber