it-swarm.asia

Apa penyebab dan solusi untuk mutasi kesalahan tabel?

Saya mengerti kesalahan tabel bermutasi disebabkan oleh cacat desain atau permintaan bermasalah.

Kueri lama baru-baru ini dimasukkan ke dalam produksi yang menghasilkan kesalahan tabel mutasi. DBA kami memecahkan masalah tetapi kami tidak tahu caranya.

Apa sebenarnya yang menyebabkan kesalahan tabel bermutasi dan bagaimana DBA kami telah memperbaiki masalahnya?

12
parmanand

Kemungkinan penyebab kesalahan tabel mutasi adalah penyalahgunaan pemicu. Berikut ini adalah contoh khas:

  1. anda memasukkan baris di tabel A
  2. pemicu pada tabel A (untuk setiap baris) mengeksekusi kueri pada tabel A, misalnya untuk menghitung kolom ringkasan
  3. Oracle melempar ORA-04091: table A bermutasi, trigger/function mungkin tidak melihatnya

Ini adalah perilaku yang diharapkan dan normal, Oracle ingin melindungi Anda dari diri Anda karena Oracle menjamin:

  • (i) bahwa setiap pernyataan adalah atomik (yaitu akan gagal atau berhasil sepenuhnya)
  • (ii) bahwa setiap pernyataan melihat tampilan data yang konsisten

Kemungkinan besar saat Anda menulis pemicu seperti ini Anda akan mengharapkan kueri (2) untuk melihat baris yang dimasukkan pada (1). Ini akan bertentangan dengan kedua poin di atas karena pembaruan belum selesai (mungkin ada lebih banyak baris yang akan dimasukkan).

Oracle dapat mengembalikan hasil yang konsisten dengan titik waktu sebelum awal pernyataan tetapi dari sebagian besar contoh yang saya lihat yang mencoba menerapkan logika ini, orang melihat pernyataan multi-baris sebagai seri langkah-langkah berturut-turut dan mengharapkan pernyataan [2] untuk melihat perubahan yang dibuat oleh langkah-langkah sebelumnya. Oracle tidak dapat mengembalikan hasil yang diharapkan dan karena itu melempar kesalahan.

Untuk bacaan lebih lanjut: "tabel bermutasi" di Ask Tom .

Jika seperti yang saya duga penyebab kesalahan tabel mutasi adalah pemicu, salah satu cara untuk menghindari kesalahan adalah dengan memindahkan logika dari pelatuk ke dalam prosedur.

17
Vincent Malgrat

A tabel bermutasi terjadi ketika pernyataan menyebabkan pemicu untuk memicu dan yang memicu referensi tabel yang menyebabkan pemicu. Cara terbaik untuk menghindari masalah seperti itu adalah dengan tidak menggunakan pemicu, tetapi saya curiga DBA tidak meluangkan waktu untuk melakukan itu. Dia bisa melakukan salah satu dari yang berikut:

9
Leigh Riffel