Apa penyebab dan solusi untuk mutasi kesalahan tabel?


12

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?

Jawaban:


17

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 tepat sebelum awal pernyataan tetapi dari sebagian besar contoh yang saya lihat bahwa mencoba menerapkan logika ini, orang melihat pernyataan multi-baris sebagai seri langkah-langkah berturut-turut dan mengharapkan pernyataan [2] untuk melihat perubahan yang dilakukan oleh langkah sebelumnya. Oracle tidak dapat mengembalikan hasil yang diharapkan dan karena itu melempar kesalahan.

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

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


9

Sebuah meja bermutasi terjadi ketika sebuah pernyataan menyebabkan pemicu kebakaran dan pemicu referensi meja yang menyebabkan pelatuk. Cara terbaik untuk menghindari masalah seperti itu adalah dengan tidak menggunakan pemicu, tapi saya curiga DBA tidak meluangkan waktu untuk melakukan itu. Dia bisa melakukan salah satu dari yang berikut:


1
Setidaknya bagi saya, mengubah menjadi pemicu setelah gagal pada 11.2.0.4.0
Software Prophets

Juga untuk saya; versi 12.1.0.2.0, dan SETELAH tidak berfungsi.
eidylon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.