Setiap transaksi terbuka aktif akan menyematkan log, mencegah pemotongan dan akhirnya menyebabkan pertumbuhan. Jika Anda memulai transaksi, menulis ke log dan kemudian menunggu selamanya dengan harapan sebuah pesan pada akhirnya akan membangunkan Anda, Anda hanya menyematkan log dan membuatnya tumbuh.
Akhir-akhir ini saya mulai merekomendasikan orang untuk menghindari WAITFOR dalam prosedur yang diaktifkan, bersama dengan loop. Cukup keluarkan PENERIMA dan lakukan, biarkan loop mekanisme aktivasi untuk Anda (itu) dan jangan menunggu, hanya MENERIMA.
Rasa WAITFOR dari RECEIVE menciptakan savepoint secara internal. Ini menghasilkan log (setidaknya 3 catatan log) dan memang menyematkan log di tempat sambil menunggu. Memiliki waktu tunggu WAITFOR yang lama (atau lebih buruk, yang tak terbatas) akan menjadi praktik yang sangat buruk.
Apakah akan WAITFOR (...) TIMEOUT 3600000menyelesaikan masalah? Misalnya rilis setiap jam.
AngryHacker
2
Log Anda akan tumbuh banyak dalam satu jam. WAITFOR (REC EIVE) dimaksudkan untuk interval seperti 5 detik ...
Remus Rusanu
1
Anda juga harus menyelidiki mengapa transaksi Anda sebenarnya aktif (memiliki log tertulis). Pola Pialang Layanan biasanya tidak menerbitkan penulisan sebelum PENERIMAAN.
Remus Rusanu
1
Saya tidak mengerti komentar terakhir Anda. Transaksi aktif karena saya mengeluarkan a WAITFOR (RECEIVE...Bisakah Anda memperluas? Mungkin, saya salah paham.
AngryHacker
8
begin transaction; waitfor(receive...)tidak akan menghasilkan catatan log apa pun (tidak akan 'mengaktifkan' transaksi) sambil menunggu, dan dengan demikian tidak akan menyematkan log. Hanya begin transaction;[insert|update|delete];waitfor(receive...)akan menyebabkan transaksi untuk 'mengaktifkan' (menghasilkan catatan log) dan dengan demikian akan benar-benar pin log sambil menunggu.
Remus Rusanu
5
Pada SQL Server 2008 R2, jika saya menjalankan WAITFOR (RECEIVE), kemudian menjalankan DBCC OPENTRAN, itu menunjukkan transaksi sebagai aktif, bahkan tanpa adanya pembaruan sebelumnya.
@binki yang merujuk komentar ke SQL Server 2005. Ini untuk 2008 R2. Mereka berperilaku berbeda sehubungan dengan masalah ini, jika saya ingat dengan benar.
WAITFOR (...) TIMEOUT 3600000
menyelesaikan masalah? Misalnya rilis setiap jam.WAITFOR (RECEIVE...
Bisakah Anda memperluas? Mungkin, saya salah paham.begin transaction; waitfor(receive...)
tidak akan menghasilkan catatan log apa pun (tidak akan 'mengaktifkan' transaksi) sambil menunggu, dan dengan demikian tidak akan menyematkan log. Hanyabegin transaction;[insert|update|delete];waitfor(receive...)
akan menyebabkan transaksi untuk 'mengaktifkan' (menghasilkan catatan log) dan dengan demikian akan benar-benar pin log sambil menunggu.Pada SQL Server 2008 R2, jika saya menjalankan WAITFOR (RECEIVE), kemudian menjalankan DBCC OPENTRAN, itu menunjukkan transaksi sebagai aktif, bahkan tanpa adanya pembaruan sebelumnya.
sumber