Мутує таблиця - stack overflow російською

У мене є таблиця, яка змінюється після вставки / видалення рядка. Тобто мутація полягає в тому, що при вставці в таблицю, треба перерахувати значення, що знаходяться в інших рядках. Я написав тригер, але він не працює, відбувається помилка. Проблема, як я розумію, виникає, коли в тригері рівня рядка є спроба звернутися до таблиці, яка змінюється тією ж пропозицією. У чому причини цієї помилки? І як можна її уникнути? І яким чином можна реалізувати перерахунок значень таблиці при зміні одного рядка (instert / delete)?

заданий 19 Січня '11 о 17:48

2 data3 data4 50

Ви робите insert в таблицю, наприклад:

id field1 field2 field3

1 data1 data2 30

2 data3 data4 50

3 data5 data6 70

Через вставки вам потрібно зробити update, наприклад, всіх field3:

Проблема полягає в тому, що дії ви виконуєте на залоченним таблиці (не знаю як oracle, я пишу про mysql, думаю, що в oracle теж саме), тобто дані не можуть бути оновлено, видалено або якось змінені, поки таблиця залочений. У mysql це LOCK TABLE / UNLOCK TABLE. По скільки insert за фактом ще не завершився, таблицю можна оновити, для цього можна піти іншим шляхом - зробити 2 запити, 1-й додасть, 2-й оновить. Можливо, що в oracle можна перевірити доступність на оновлення таблиці, і, наприклад, у другій потік сунути оновлення, або чекати поки таблиця не «звільниться", тим самим ставши доступною для поновлення. Сподіваюся, що хоч чимось допоміг.

відповідь дан 19 Січня '11 о 21:43

Ту Алекс Силаєв. Для того щоб прочитати дані немає необхідності блокувати дані. Оракл НЕ MySQL. Також читання не вимагає звільнення таблиці, на це є реалізована Багатоверсійність з використанням сегментів відкоту.

Зазвичай, помилка мутує таблиці вирішується двома способами:

  1. Тригер в автономній транзаціі, але корефеі Оракл не рекомендують його використовувати.
  2. І більш вірний спосіб. Відкладене обробка в тригері AFTER, як і запропонував (14 Mar 14:09) andivanov. Зберігаєте дані в масив, потім вибираєте їх.

відповідь дан 24 Серпня '11 о 15:46

Хотілося б поглянути на код вашого тригера.

Накидав невеликий прімерчік, думаю він направить вас.

відповідь дан 3 Лютого '11 об 11:26

Схожі статті