|
О блокировках
|
|||
---|---|---|---|
#18+
День добрый. Никак не могу понять, как fb разруливает апдейты одной и той же записи. (возможно плохо искал) Так вот, периодически у меня вылезает проблема конфликта обновлений, параметры транзакций выставлены как rec_ver и wait. Сегодня словил вышеописанную проблему, стартонула транзакция, которая делает апдейт записи, спустя секунду стартонула вторая транзакция, которая апдейтит ту же запись, что и первая. В итоге вторая тр завершилась, а первая откатилась с ошибкой конфликта обновлений. Буду очень признателен, если кто-то разъяснит из-за чего происходит такая ситуация (fb 3.0.5 ss). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2020, 22:40 |
|
О блокировках
|
|||
---|---|---|---|
#18+
Чти: http://www.ibase.ru/transactions/ Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 00:21 |
|
О блокировках
|
|||
---|---|---|---|
#18+
demon1992В итоге вторая тр завершилась, а первая откатилась с ошибкой конфликта обновлений. Раз используется wait, тогда тут всё нормально. Потому что вторая-то сделала коммит, а первая "не успела" обновить, и значит после коммита конкурента должна перечитать данные (если это не snapshot). Вообще с Firebird wait если и надо, то в специфических случаях. Лучше no wait, т.е. получать сообщения о конфликте обновлений сразу. Это не MS SQL, который изменения накатывает записывает по коммиту. В FB изменения идут сразу "по месту", а коммитом они только подтверждаются. Кроме http://www.ibase.ru/transactions/ если используете FIBPlus, FireDAC или подобные - то желательно прочитать и http://www.ibase.ru/ibx/ ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 01:44 |
|
О блокировках
|
|||
---|---|---|---|
#18+
Статью читал, и ролик смотрел. Я почему то всегда думал, что движок разруливает эти самые блокировки тем, что если обнаруживает незакоммиченные данные, новая транзакция не будет сразу вываливать ошибку, а будет пытаться сделать несколько попыток обновить запись. Но я всё равно не понимаю, как в высоконагруженной системе с конкурентным доступом, работает без проблем, а потом раз в полгода вываливается ошибка конфликта обновлений. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 08:13 |
|
О блокировках
|
|||
---|---|---|---|
#18+
demon1992 Но я всё равно не понимаю, как в высоконагруженной системе с конкурентным доступом, работает без проблем, а потом раз в полгода вываливается ошибка конфликта обновлений. Тысячи роботов или сотни пользователей? А сотни пользователей работают как роботы или, всё-таки, менее интенсивно? Ну и самое главное - вы, конечно, уже знаете, сколько времени занимает типичная транзакции и какова вероятность конфликта обновлений? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 08:38 |
|
О блокировках
|
|||
---|---|---|---|
#18+
Не роботы, но транзакций много, пишущая транзакция работает быстро, меньше секунды. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 09:10 |
|
О блокировках
|
|||
---|---|---|---|
#18+
Вообще у меня вопрос в другом: ждет ли движок какое-то время чтобы повторно накатить изменения, если натыкается на незакоммиченные данные? И как так получилось, что тр2 обновила запись, при запущенной ранее тр1, которая так же обновляла ту самую запись что и тр2. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 09:18 |
|
О блокировках
|
|||
---|---|---|---|
#18+
Я немного не договорил еще. Запись обновляется процедурой, и перед выполнением есть еще исполняемый код. Могло ли получится так, что тр2 начала обновлять запись раньше чем тр1, и из-за этого и получить конфликт обновления? Если так, то это очень странно, в процедуре перед обновлением идет всего пару единичных селектов по индексу, там нет ничего такого что могло бы зависнуть, а разница между стартом транзакций 1.5 сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 09:38 |
|
О блокировках
|
|||
---|---|---|---|
#18+
demon1992 Вообще у меня вопрос в другом: ждет ли движок какое-то время чтобы повторно накатить изменения, если натыкается на незакоммиченные данные? - если конкурент откатился - читаем и идём дальше, - если конкурент подтвердился ещё активен, то выдаёт isc_read_conflict, - если конкурент подтвердился - RC NRV тр-ция читает первичную версию. Другие тр-ции не ждут и ищут видимую для них бекверсию. Далее, если запись была нами прочитана, но была изменена конкурентом в промежутке между чтением и самим апдейтом, то снова ждём финального состояния конкурента (если мы READ COMMITTED) и - если конкурент откатился - пишем свою версию, - если конкурент ещё активен или подтвердился, то выдаём isc_update_conflict. Это на пальцах, там больше деталей на самом деле. PS В 4-ке на уровне READ COMMITTED READ CONSISTENCY алгоритм сложнее и может полностью исключить isc_update_conflict в большинстве случаев PPS исправил немного ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 10:04 |
|
О блокировках
|
|||
---|---|---|---|
#18+
demon1992 И как так получилось, что тр2 обновила запись, при запущенной ранее тр1, которая так же обновляла ту самую запись что и тр2. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 10:06 |
|
О блокировках
|
|||
---|---|---|---|
#18+
demon1992а будет пытаться сделать несколько попыток обновить запись зачем это движку? В общем, читать надо http://www.ibase.ru/mga/ и убирать wait из параметров транзакций. "транзакций много" - сколько, миллион в сутки, два, пять? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 10:31 |
|
О блокировках
|
|||
---|---|---|---|
#18+
hvlad, Спасибо за разъяснение. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 10:42 |
|
О блокировках
|
|||
---|---|---|---|
#18+
kdv, Бывает и 5 и 10 и 20. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 10:45 |
|
О блокировках
|
|||
---|---|---|---|
#18+
demon1992 Бывает и 5 и 10 и 20. С учётом того, что есть периоды пиковой активности, (вероятно) не все транзакции пишущие и далеко не все пишущие транзакции вообще могут конфликтовать - получаем, что вероятность конфикта "достаточно мала". Собственно именно это и составляет корень проблемы "вот тут мы не будем делать правильно, но сложно": более простой вариант работает почти всегда. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 11:38 |
|
О блокировках
|
|||
---|---|---|---|
#18+
kdvзачем это движку? Ну, в четвёрке что-то такое сделали... kdvи убирать wait из параметров транзакций. А вот это вопрос спорный. С одной стороны да, хорошо получать ошибку сразу. С другой стороны естественная (и практически единственная вменяемая) реакция на эту ошибку - откатить транзакцию, перечитать данные и попробовать снова. И вот тут-то хорошо бы таки подождать пока конкурент завершится, иначе будем долбиться как дятлы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 12:53 |
|
О блокировках
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov kdvи убирать wait из параметров транзакций. А вот это вопрос спорный.Согласен. Если говорить о пар-рах тр-ции с точки зрения апдейтов, то тот, кто читал хотя бы 22165043 , не мог не заметить, что использование RC NRV значительно сокращает вероятность конфликтов обновления. Особенно при не очень высокой конкуренции. Но, конечно, не гарантирует их отсутствие. Новый режим RC RC в 4-ке уменьшает эту вероятность почти до нуля. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 13:15 |
|
О блокировках
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovреакция на эту ошибку - откатить транзакцию это только если snapshot. там другого варианта и нет. А с read committed вполне можно перечитать запись, и дальше решать - опять пытаться обновлять ее, или нет. Dimitry SibiryakovНу, в четвёрке что-то такое сделали... да нет там ничего такого. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 15:03 |
|
О блокировках
|
|||
---|---|---|---|
#18+
kdv Dimitry SibiryakovНу, в четвёрке что-то такое сделали... да нет там ничего такого. https://github.com/FirebirdSQL/firebird/blob/master/doc/README.read_consistency.md Читать до прояснения, особенно главу "Update conflicts handling" ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 15:16 |
|
О блокировках
|
|||
---|---|---|---|
#18+
kdvс read committed вполне можно перечитать запись, и дальше решать - опять пытаться обновлять ее, или нет. А смысл это делать до того, как конкурент завершится?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 15:22 |
|
О блокировках
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovА смысл это делать до того, как конкурент завершится?.. как раз и проверять, завершился он или нет. hvladЧитать до прояснения да, действительно "долбит". Ну и ладно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 15:37 |
|
О блокировках
|
|||
---|---|---|---|
#18+
kdv Dimitry SibiryakovА смысл это делать до того, как конкурент завершится?.. как раз и проверять, завершился он или нет.И как ты собрался это проверять ? kdv да, действительно "долбит". Ну и ладно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2020, 15:42 |
|
|
start [/forum/topic.php?fid=40&msg=39978008&tid=1560296]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
4ms |
track hit: |
173ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 247ms |
total: | 513ms |
0 / 0 |