|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
Фрагмент из триггера типа Before Update: Код: plaintext 1. 2. 3. 4. 5.
При многопользовательской работе приращения поля RASHOD1 выполняются исключительно этим триггером. Насколько я понял, пока работает этот триггер в рамках одной транзакции, любые другие параллельные транзакции не могут запустить его в работу. Но если он закончил работать, то в момент, когда ещё не произведён Commit, другая транзакция запустит его и прочитает старое значение RASHOD1, если сразу после этого первая транзакция коммитится, а вторая обновит поле RASHOD1, то в итоге после коммита второй транзакции нарушится целостность БД, - должно быть Код: plaintext
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 10:49 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
Привет, FF5_____! Ты пишешь: FF5_____в момент, когда ещё не произведён Commit, другая транзакция запустит его и прочитает старое значение RASHOD1, если сразу после этого первая транзакция коммитится, а вторая обновит поле RASHOD1как всё запущено... читай об транзакциях на ibase.ru -- With best regards, Мимопроходящий. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 10:53 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
Вот тут особенно понравилось. FF5_____пока работает этот триггер в рамках одной транзакции, любые другие параллельные транзакции не могут запустить его в работу ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 10:56 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
ничего то ты не понял. авторНасколько я понял, пока работает этот триггер в рамках одной транзакции, любые другие параллельные транзакции не могут запустить его в работу. нет. не может выполниться ОБНОВЛЕНИЕ той же записи, которая уже обновлена. Триггер тут виноват лишь в том, что в нем этот update. авторНо если он закончил работать, то в момент, когда ещё не произведён Commit, другая транзакция запустит его и прочитает старое значение RASHOD1, если сразу после этого первая транзакция коммитится, а вторая обновит поле RASHOD1, то в итоге после коммита второй транзакции нарушится целостность БД нихрена не нарушится. транзакция 1 вызывает триггер в котором update транзакция 2 вызывает триггер в котором update если update был одной и той же записи, "транзакция 2" получит сообщение об ошибке. повторяем: транзакция 1 вызывает триггер в котором update транзакция 1 делает commit транзакция 2 вызывает триггер в котором update никаких конфликтов или проблем. Потому что транзакция 2 прочитает уже обновленную запись, и ее же обновит. Вот если ты будешь в приложении, разными операторами сначала ЧИТАТЬ, потом СКЛАДЫВАТЬ а потом ЗАПИСЫВАТЬ, то тогда получится не просто фигня в базе, а черт знает что. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 10:56 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
Перечитай о транзакциях два раза, затем когда действительно всё поймёшь, там же есть хорошая статья об оптимистических и пессимистических блокировках. Кроме того, тут свежая ветка поблизости, обсуждались как раз тонкости работы таких штуковин. Но это в самую последнюю очередь! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 10:58 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
WildSeryВот тут особенно понравилось. FF5_____пока работает этот триггер в рамках одной транзакции, любые другие параллельные транзакции не могут запустить его в работу А как правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 11:17 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
kdvничего то ты не понял. ... нихрена не нарушится. транзакция 1 вызывает триггер в котором update транзакция 2 вызывает триггер в котором update если update был одной и той же записи, "транзакция 2" получит сообщение об ошибке. повторяем: транзакция 1 вызывает триггер в котором update транзакция 1 делает commit транзакция 2 вызывает триггер в котором update никаких конфликтов или проблем. Потому что транзакция 2 прочитает уже обновленную запись, и ее же обновит. Я имел в виду такой порядок: транзакция 1 вызывает триггер в котором update - триггер закончил работу, но коммита ещё нет транзакция 2 вызывает триггер в котором update - в триггере читается старая закомиченная версия записи, но сразу после этой строrи в триггере - транзакция 1 делает commit транзакция 2 продолжает выполнение начатого триггера транзакция 2 делает commit ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 11:18 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
Прочитай сперва статью, подумай. Если какие-то сомнения останутся, развеем. Если не лень будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 11:18 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
FF5_____Я имел в виду такой порядок: транзакция 1 вызывает триггер в котором update - триггер закончил работу, но коммита ещё нет транзакция 2 вызывает триггер в котором update - в триггере читается старая закомиченная версия записи, но сразу после этой строrи в триггере - транзакция 1 делает commit транзакция 2 продолжает выполнение начатого триггера транзакция 2 делает commit Мой тебе совет. Не программируй ничего до тех пор пока не разберешься с транзакциями. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 11:49 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
kdv...если update был одной и той же записи, "транзакция 2" получит сообщение об ошибке. То есть, когда запрос Update пытается оператором SET обновить запись, которая уже обновлена другой транзакцией, но не закоммичена ею, то он обламывается и его надо снова повторять. Спасибо за разъяснение. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 11:50 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
WildSeryПрочитай сперва статью, подумай. Если какие-то сомнения останутся, развеем. Если не лень будет. Кстати, насчёт "FireBird. Руководства разработчика" я не наврал. Поиск в ней есть, например, "helen borrie" или "Конфиrурирование". Просто в некоторых местах кириллица перепутана с латиницей, как в последнем случае "г" на "r". ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 11:59 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
. Воблин. Это ж картинка, явно! Точно, ищет, сцуко. Распознаёт на лету он, что ли? (у меня 0.4.1 версия стоит) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 12:20 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
авторТо есть, когда запрос Update пытается оператором SET обновить запись, которая уже обновлена другой транзакцией, но не закоммичена ею, то он обламывается и его надо снова повторять. да. можно повторять, если транзакция read_committed. В общем, читай www.ibase.ru/devinfo/ibtrans.htm ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2007, 14:07 |
|
Триггер для обновления данных с сохранением целостности БД
|
|||
---|---|---|---|
#18+
FF5_____, Код: sql 1. 2. 3. 4. 5.
Зачем же в before update делать еще апдейт, при чем этой же записи??? Достаточно написать: Код: sql 1.
На то он before и, думаю, это снимет все твои проблемы... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2015, 14:49 |
|
|
start [/forum/topic.php?fid=40&fpage=75&tid=1562779]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
22ms |
get forum data: |
2ms |
get page messages: |
80ms |
get tp. blocked users: |
1ms |
others: | 280ms |
total: | 448ms |
0 / 0 |