Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггер для обновления данных с сохранением целостности БД / 15 сообщений из 15, страница 1 из 1
04.06.2007, 10:49
    #34571278
FF5_____
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
Фрагмент из триггера типа Before Update:
Код: plaintext
1.
2.
3.
4.
5.
...
    update karta_ucheta
      set RASHOD1 = coalesce(RASHOD1, 0 ) + coalesce(new.KOLVO1, 0 )
      where (ID_KARTA_UCHETA = new.ID_KARTA_UCHETA);
...
Этот фрагмент читает старое значение поля RASHOD1 и добавляет к нему значение поля KOLVO1. Триггер работает в короткоживущей транзакции - при срабатывании Post, вначале работает этот триггер, затем сохраняются остальные изменения в таблице.
При многопользовательской работе приращения поля RASHOD1 выполняются исключительно этим триггером. Насколько я понял, пока работает этот триггер в рамках одной транзакции, любые другие параллельные транзакции не могут запустить его в работу. Но если он закончил работать, то в момент, когда ещё не произведён Commit, другая транзакция запустит его и прочитает старое значение RASHOD1, если сразу после этого первая транзакция коммитится, а вторая обновит поле RASHOD1, то в итоге после коммита второй транзакции нарушится целостность БД, - должно быть
Код: plaintext
RASHOD1 = RASHOD1(старое значение) + KOLVO1(первая транз.) + KOLVO1(вторая транз.)
а получится
Код: plaintext
RASHOD1 = RASHOD1(старое значение) + KOLVO1(вторая транз.)
В общем, надо заблокировать строку с полем RASHOD1 на чтение пока выполняется транзакция. Как это можно сделать? Вообще, какие могут быть варианты?
...
Рейтинг: 0 / 0
04.06.2007, 10:53
    #34571295
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
Привет, FF5_____!
Ты пишешь:

FF5_____в момент, когда ещё не произведён Commit,
другая транзакция запустит его и прочитает старое
значение RASHOD1, если сразу после этого первая
транзакция коммитится, а вторая обновит поле RASHOD1как всё запущено...
читай об транзакциях на ibase.ru

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
04.06.2007, 10:56
    #34571309
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
Вот тут особенно понравилось.
FF5_____пока работает этот триггер в рамках одной транзакции, любые другие параллельные транзакции не могут запустить его в работу
...
Рейтинг: 0 / 0
04.06.2007, 10:56
    #34571310
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
ничего то ты не понял.

авторНасколько я понял, пока работает этот триггер в рамках одной транзакции, любые другие параллельные транзакции не могут запустить его в работу.
нет. не может выполниться ОБНОВЛЕНИЕ той же записи, которая уже обновлена. Триггер тут виноват лишь в том, что в нем этот update.
авторНо если он закончил работать, то в момент, когда ещё не произведён Commit, другая транзакция запустит его и прочитает старое значение RASHOD1, если сразу после этого первая транзакция коммитится, а вторая обновит поле RASHOD1, то в итоге после коммита второй транзакции нарушится целостность БД

нихрена не нарушится.

транзакция 1 вызывает триггер в котором update
транзакция 2 вызывает триггер в котором update

если update был одной и той же записи, "транзакция 2" получит сообщение об ошибке.
повторяем:
транзакция 1 вызывает триггер в котором update
транзакция 1 делает commit
транзакция 2 вызывает триггер в котором update

никаких конфликтов или проблем. Потому что транзакция 2 прочитает уже обновленную запись, и ее же обновит.


Вот если ты будешь в приложении, разными операторами сначала ЧИТАТЬ, потом СКЛАДЫВАТЬ а потом ЗАПИСЫВАТЬ, то тогда получится не просто фигня в базе, а черт знает что.
...
Рейтинг: 0 / 0
04.06.2007, 10:58
    #34571317
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
Перечитай о транзакциях два раза, затем когда действительно всё поймёшь, там же есть хорошая статья об оптимистических и пессимистических блокировках.
Кроме того, тут свежая ветка поблизости, обсуждались как раз тонкости работы таких штуковин. Но это в самую последнюю очередь!
...
Рейтинг: 0 / 0
04.06.2007, 11:17
    #34571384
FF5_____
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
WildSeryВот тут особенно понравилось.
FF5_____пока работает этот триггер в рамках одной транзакции, любые другие параллельные транзакции не могут запустить его в работу
А как правильно?
...
Рейтинг: 0 / 0
04.06.2007, 11:18
    #34571390
FF5_____
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
kdvничего то ты не понял.
...
нихрена не нарушится.

транзакция 1 вызывает триггер в котором update
транзакция 2 вызывает триггер в котором update

если update был одной и той же записи, "транзакция 2" получит сообщение об ошибке.
повторяем:
транзакция 1 вызывает триггер в котором update
транзакция 1 делает commit
транзакция 2 вызывает триггер в котором update

никаких конфликтов или проблем. Потому что транзакция 2 прочитает уже обновленную запись, и ее же обновит.

Я имел в виду такой порядок:
транзакция 1 вызывает триггер в котором update - триггер закончил работу, но коммита ещё нет
транзакция 2 вызывает триггер в котором update - в триггере читается старая закомиченная версия
записи, но сразу после этой строrи в триггере -
транзакция 1 делает commit
транзакция 2 продолжает выполнение начатого триггера
транзакция 2 делает commit
...
Рейтинг: 0 / 0
04.06.2007, 11:18
    #34571393
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
Прочитай сперва статью, подумай. Если какие-то сомнения останутся, развеем. Если не лень будет.
...
Рейтинг: 0 / 0
04.06.2007, 11:49
    #34571532
Лентяй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
FF5_____Я имел в виду такой порядок:
транзакция 1 вызывает триггер в котором update - триггер закончил работу, но коммита ещё нет
транзакция 2 вызывает триггер в котором update - в триггере читается старая закомиченная версия
записи, но сразу после этой строrи в триггере -
транзакция 1 делает commit
транзакция 2 продолжает выполнение начатого триггера
транзакция 2 делает commit
Мой тебе совет. Не программируй ничего до тех пор пока не разберешься с транзакциями.
...
Рейтинг: 0 / 0
04.06.2007, 11:50
    #34571535
FF5_____
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
kdv...если update был одной и той же записи, "транзакция 2" получит сообщение об ошибке.

То есть, когда запрос Update пытается оператором SET обновить запись, которая уже обновлена другой транзакцией, но не закоммичена ею, то он обламывается и его надо снова повторять.
Спасибо за разъяснение.
...
Рейтинг: 0 / 0
04.06.2007, 11:59
    #34571562
FF5_____
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
WildSeryПрочитай сперва статью, подумай. Если какие-то сомнения останутся, развеем. Если не лень будет.
Кстати, насчёт "FireBird. Руководства разработчика" я не наврал. Поиск в ней есть, например, "helen borrie" или "Конфиrурирование". Просто в некоторых местах кириллица перепутана с латиницей, как в последнем случае "г" на "r".
...
Рейтинг: 0 / 0
04.06.2007, 12:20
    #34571635
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
. Воблин. Это ж картинка, явно! Точно, ищет, сцуко. Распознаёт на лету он, что ли?
(у меня 0.4.1 версия стоит)
...
Рейтинг: 0 / 0
04.06.2007, 14:07
    #34572099
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
авторТо есть, когда запрос Update пытается оператором SET обновить запись, которая уже обновлена другой транзакцией, но не закоммичена ею, то он обламывается и его надо снова повторять.
да. можно повторять, если транзакция read_committed. В общем, читай www.ibase.ru/devinfo/ibtrans.htm
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
12.06.2015, 14:49
    #38982948
D@lex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
FF5_____,
Код: sql
1.
2.
3.
4.
5.
...
    update karta_ucheta
      set RASHOD1 = coalesce(RASHOD1,0) + coalesce(new.KOLVO1,0)
      where (ID_KARTA_UCHETA = new.ID_KARTA_UCHETA);
...


Зачем же в before update делать еще апдейт, при чем этой же записи???
Достаточно написать:
Код: sql
1.
new.RASHOD1 = coalesce(old.RASHOD1,0) + coalesce(new.KOLVO1,0); 


На то он before и, думаю, это снимет все твои проблемы...
...
Рейтинг: 0 / 0
12.06.2015, 14:50
    #38982950
D@lex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер для обновления данных с сохранением целостности БД
)))) Не посмотрел на год, но все-таки...
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггер для обновления данных с сохранением целостности БД / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]