powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггер для обновления данных с сохранением целостности БД
15 сообщений из 15, страница 1 из 1
Триггер для обновления данных с сохранением целостности БД
    #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
Триггер для обновления данных с сохранением целостности БД
    #34571295
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, FF5_____!
Ты пишешь:

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

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

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

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

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

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

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

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


Вот если ты будешь в приложении, разными операторами сначала ЧИТАТЬ, потом СКЛАДЫВАТЬ а потом ЗАПИСЫВАТЬ, то тогда получится не просто фигня в базе, а черт знает что.
...
Рейтинг: 0 / 0
Триггер для обновления данных с сохранением целостности БД
    #34571317
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перечитай о транзакциях два раза, затем когда действительно всё поймёшь, там же есть хорошая статья об оптимистических и пессимистических блокировках.
Кроме того, тут свежая ветка поблизости, обсуждались как раз тонкости работы таких штуковин. Но это в самую последнюю очередь!
...
Рейтинг: 0 / 0
Триггер для обновления данных с сохранением целостности БД
    #34571384
FF5_____
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryВот тут особенно понравилось.
FF5_____пока работает этот триггер в рамках одной транзакции, любые другие параллельные транзакции не могут запустить его в работу
А как правильно?
...
Рейтинг: 0 / 0
Триггер для обновления данных с сохранением целостности БД
    #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
Триггер для обновления данных с сохранением целостности БД
    #34571393
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитай сперва статью, подумай. Если какие-то сомнения останутся, развеем. Если не лень будет.
...
Рейтинг: 0 / 0
Триггер для обновления данных с сохранением целостности БД
    #34571532
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FF5_____Я имел в виду такой порядок:
транзакция 1 вызывает триггер в котором update - триггер закончил работу, но коммита ещё нет
транзакция 2 вызывает триггер в котором update - в триггере читается старая закомиченная версия
записи, но сразу после этой строrи в триггере -
транзакция 1 делает commit
транзакция 2 продолжает выполнение начатого триггера
транзакция 2 делает commit
Мой тебе совет. Не программируй ничего до тех пор пока не разберешься с транзакциями.
...
Рейтинг: 0 / 0
Триггер для обновления данных с сохранением целостности БД
    #34571535
FF5_____
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv...если update был одной и той же записи, "транзакция 2" получит сообщение об ошибке.

То есть, когда запрос Update пытается оператором SET обновить запись, которая уже обновлена другой транзакцией, но не закоммичена ею, то он обламывается и его надо снова повторять.
Спасибо за разъяснение.
...
Рейтинг: 0 / 0
Триггер для обновления данных с сохранением целостности БД
    #34571562
FF5_____
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryПрочитай сперва статью, подумай. Если какие-то сомнения останутся, развеем. Если не лень будет.
Кстати, насчёт "FireBird. Руководства разработчика" я не наврал. Поиск в ней есть, например, "helen borrie" или "Конфиrурирование". Просто в некоторых местах кириллица перепутана с латиницей, как в последнем случае "г" на "r".
...
Рейтинг: 0 / 0
Триггер для обновления данных с сохранением целостности БД
    #34571635
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
. Воблин. Это ж картинка, явно! Точно, ищет, сцуко. Распознаёт на лету он, что ли?
(у меня 0.4.1 версия стоит)
...
Рейтинг: 0 / 0
Триггер для обновления данных с сохранением целостности БД
    #34572099
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТо есть, когда запрос Update пытается оператором SET обновить запись, которая уже обновлена другой транзакцией, но не закоммичена ею, то он обламывается и его надо снова повторять.
да. можно повторять, если транзакция read_committed. В общем, читай www.ibase.ru/devinfo/ibtrans.htm
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Триггер для обновления данных с сохранением целостности БД
    #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
Триггер для обновления данных с сохранением целостности БД
    #38982950
D@lex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
)))) Не посмотрел на год, но все-таки...
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггер для обновления данных с сохранением целостности БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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