|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
простейший сервис на PHP, принимает запрос, читает, и пишет данные в таблицу. Ошибка возникает когда приходит два запроса одновремено. Вот что в логах по первому запросу: авторerr: 23.08.2019 22:57:29 : (2)ibase_execute(): lock conflict on no wait transaction deadlock update conflicts with concurrent update concurrent transaction number is 16936694 in /srv/www/service.fitron/app/library/firebird/firebird.php at 207Array ( [query] => update webdata set fvalue=? where idWebCome=29164 and fname=? [param] => Array ( [0] => Resource id #21 [1] => Новый клиент [2] => TAG_NAME ) вот что в логах по второму авторerr: 23.08.2019 22:57:29 : (2)ibase_execute(): lock conflict on no wait transaction deadlock update conflicts with concurrent update concurrent transaction number is 16936694 in /srv/www/service.fitron/app/library/firebird/firebird.php at 207Array ( [query] => update webdata set fvalue=? where idWebCome=29164 and fname=? [param] => Array ( [0] => Resource id #21 [1] => Хорошее [2] => TAG_NAME ) Вот сама функция выполняющая запрос на апдейт записи Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
Проблема, я так понимаю в этом "IBASE_WRITE | IBASE_NOWAIT | IBASE_COMMITTED | IBASE_REC_VERSION", а именно в параметрах транзакции. IBASE_WRITE - пишущая транзакция IBASE_NOWAIT - действия при конфликте, при данном режиме, СУБД не ждет завершения конфликтующей транзакции, а просто выдает ошибку. пробовал WAIT, но система просто ждет и так же вываливается в ошибку. IBASE_COMMITTED - т.е. в данной транзакции все изменения, которые были подтверждены другими транзакциями, будут видны немедленно + IBASE_REC_VERSION игнорирует non-committed версии, читая последнюю committed-версию. Подскажите, какие параметры пишущей транзакции поставить, чтобы два одновременных запроса на изменение одной и той же записи не конфликтовали друг с другом? но и видели все последние изменения commit других транзакций. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 11:18 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
snakenestПодскажите, какие параметры пишущей транзакции поставить, чтобы два одновременных запроса на изменение одной и той же записи не конфликтовали друг с другом? Обломись. Базу надо переводить на Оракул или переделывать логику. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 12:18 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
snakenest IBASE_COMMITTED - т.е. в данной транзакции все изменения, которые были подтверждены другими транзакциями, будут видны немедленноНе знаю, но очень сомневаюсь. Такое называется READ_COMMITED snakenestПодскажите, какие параметры пишущей транзакции поставить, чтобы два одновременных запроса на изменение одной и той же записи не конфликтовали друг с другом? но и видели все последние изменения commit других транзакций. 1. Не NOWAIT, а именно WAIT. 2. READ_COMMITED + REC_VERSION. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 12:21 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
YuRock, автор1. Не NOWAIT, а именно WAIT. при таком варианте, просто ждет, и все равно вылетает ошибка авторНе знаю, но очень сомневаюсь. Такое называется READ_COMMITED IBASE_COMMITTED - это оно и есть ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 12:28 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovsnakenestПодскажите, какие параметры пишущей транзакции поставить, чтобы два одновременных запроса на изменение одной и той же записи не конфликтовали друг с другом? Обломись. Базу надо переводить на Оракул или переделывать логику. Oracle - хороший вариант, но лучше тогда на PostgreSQL "или переделывать логику" ? как? Пришли два запроса на http, одновременно, сервер запустил два потока, работают они одновременно, и оба запроса обновляют одну и туже запись. Переписать Apache, можно, но долго. Налаживать взаимодействия между двумя процессами PHP - как? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 12:35 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
snakenest"или переделывать логику" ? как? Убрать вот это самое "оба запроса обновляют одну и туже запись". Ибо что-то протухло в этой консерватории. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 12:44 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovsnakenest"или переделывать логику" ? как? Убрать вот это самое "оба запроса обновляют одну и туже запись". Ибо что-то протухло в этой консерватории. т.е. выполнение одновременного Update одной записи - для firebird это невозможно ни при каких обстоятельствах ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 12:55 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
snakenestвыполнение одновременного Update одной записи - для firebird это невозможно ни при каких обстоятельствах ? ДА! Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 13:07 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
snakenest, "логи" указывают на одну и ту же тр-цию конкурента. Т.е. либо у тебя 3 писателя, либо ты не те логи показываешь. Далее, в запросе два маркера пар-ров, в логе видно что массив пар-ров из 3-х эл-тов. И основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый ? Понятие lost update тебе знакомо ? Обработка конфликта обновления обычно состоит из : - откат тр-ции - старт новой тр-ции - перечитывание записи - попытка апдейта - проверка ошибки, коммит или всё сначала Это оптимистичный подход, когда конфликты не часто случаются. Некоторые СУБД в некоторых (не всех!) случаях применяют этот алгоритм самостоятельно. Можно применить пессимистичный подход - заблокировать запись (select with lock в wait тр-ции) и потом её обновлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 13:29 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
hvladsnakenest, "логи" указывают на одну и ту же тр-цию конкурента. Т.е. либо у тебя 3 писателя, либо ты не те логи показываешь. Далее, в запросе два маркера пар-ров, в логе видно что массив пар-ров из 3-х эл-тов. И основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый ? Понятие lost update тебе знакомо ? Обработка конфликта обновления обычно состоит из : - откат тр-ции - старт новой тр-ции - перечитывание записи - попытка апдейта - проверка ошибки, коммит или всё сначала Это оптимистичный подход, когда конфликты не часто случаются. Некоторые СУБД в некоторых (не всех!) случаях применяют этот алгоритм самостоятельно. Можно применить пессимистичный подход - заблокировать запись (select with lock в wait тр-ции) и потом её обновлять. Да, получается три одновременно пришедших запроса "терзают" одну и туже запись. Первый выполнился без ошибок и в логах чисто, два оставшихся выполнились с ошибкой. Три параметра, это особенности этого вызова: Код: php 1. 2.
первый параметр это ссылка на ресурс с транзакцией. hvladИ основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый ? Да. И поэтому я решил проблему изменив запрос на "update webdata set fvalue=? where idWebCome=29164 and fname=? and fvalue is null" тогда при срабатывании первого апдейта, остальные просто не могу обновить так как не срабатывает условие. Но тут вопрос не в конкретном этом запросе. А именно, какие параметры пишущей транзакции позволят избежать блокировки при одновременном изменении одной и тойже записи. Не ужели такое невозможно в Firebird? Ведь он выдает deadlock, т.е. перед тем как произвести действия, проверяет и видит что прямо вот сейчас она уже меняется. Т.е. нельзя не выдавать deadlock, а просто поставить транзакцию в очередь и дождавшись окончания первой выполнить следующую? По логике, так работать должен WAIT, но по факту это просто зависание и выдача того же deadlock только чуть позже, и при этом транзакции которая мешала, уже нет, она уже завершилась! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 13:55 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
snakenesthvladИ основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый ? Да. Значит и первый может забить на то, что напишет второй. Так в чём проблема-то? Не прошёл update, так не прошёл. Какие именно данные будут в таблице - твоей задаче без разницы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 13:57 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
snakenesthvladИ основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый ? Да.Ответ не правильный, думай ещё. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 14:48 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
snakenestт.е. выполнение одновременного Update одной записи - для firebird это невозможно ни при каких обстоятельствах ? это нормально для любой СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 15:40 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
snakenest, не плохо бы - при ошибке ibase_execute откатывать транзакцию - проверять результат ibase_commit - познакомиться с PSR-1, PSR-2 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2019, 19:22 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Транзакции с параметрами READ WRITE READ COMMITTED NO RECORD_VERSION WAIT работают без блокировок, ожидая освобождение и перезаписывая данные друг друга. Источник . ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 07:35 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Дело не в транзакциях, дело в консерватории. Ни оракл, ни потгрес тут не поможет. Без выкидывания апдейтов этот паровоз с места не сдвинется. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 11:04 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
bsv9Транзакции с параметрами READ WRITE READ COMMITTED NO RECORD_VERSION WAIT работают без блокировок, ожидая освобождение и перезаписывая данные друг друга. Источник несколько преувеличивает. Это работает для двух транзакций. На трёх, как у аффтара, получится тот же облом. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 12:23 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovЗначит и первый может забить на то, что напишет второй. Так в чём проблема-то? вот-вот. как вариант - сделать обновление данных тут через SP либо EB, которые будут дёргать "in autonomous transaction". а обновятся данные по факту или нет - всем пофигу, иногда будут обновляться. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 16:36 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Ariochа обновятся данные по факту или нет - всем пофигуЗачем тогда вообще обновлять? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 16:44 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, а вот не знаю.... но предположить могу допустим, задача - примерно как пользовательский форум. или онлайн магазин. где какой-то аггрегат (количество постов, остаток SKU) изменяется несколько раз в секунду. посетителя сайта - не игроки на бирже, они в тысячных долях секунды не оперируют. для них - корректность агрегата на последние плюс минус 60 секунд - достаточная точность ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 17:08 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Ariochдопустим, задача - примерно как пользовательский форум. или онлайн магазин. тогда поменять FB на MySQL без транзакций. Пусть они переписывают любые изменения как попало (как в dbf). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 18:49 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
kdv, а он уже с транзакциями, это он в 3-й версии был такой, сейчас он менее удивительный ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 18:52 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Arioch, без транзакций MySQL и сейчас есть. Там от движка зависит. Хотя сейчас по умолчанию транзакционный движок, но можно выбрать и другой. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2019, 19:26 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Ariochа он уже с транзакциями, это он в 3-й версии был такой, сейчас он менее удивительный в 3й версии там уже все было на порядок два выше интербейза. и innodb енжин был, с его полноценными undo и redo логами, с нормальным консистентным чтением на read comitted, единым кешем и без сборки мусора. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 11:41 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
йо, ты логин свой просрал что ле? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 11:48 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
да уж точно "на голову выше", на мутантную заменяющие ошибки рандомом "чтобы лучше=спокойнее программисту было" голову https://sql-info.de/mysql/gotchas.html ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 11:55 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
27.08.2019 11:55, Arioch пишет: > да уж точно "на голову выше" забей. не надо спорить с идиотом. у него травма от интербейза. незаживающая... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 11:59 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
H5N1, Третьей версией вообще пользоваться нельзя было. Оно до 8 версии вообще метаданные могло повредить при неудачном DDL (ибо хранились они в нетранзакционном хранилище с какого то бодуна) и undo/redo ему в этом никак не помогали. А уж про кривизну егошного диалекта SQL того времени я вообще промолчу. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 12:18 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Ariochда уж точно "на голову выше", на мутантную заменяющие ошибки рандомом "чтобы лучше=спокойнее программисту было" голову https://sql-info.de/mysql/gotchas.html ну может это не оракл, но на голову выше. я уже расписал за счет чего на голову выше. а если уж мерятся мутью, то уж всяко cursor stability и невосстановимый бэкап составят достойную конкуренцию всей мути что была в mysql. вот и в данной задачке mysql бы просто установил бы лок на обновляемое поле и никаких проблем на mysql не возникло бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 12:23 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Симонов ДенисТретьей версией вообще пользоваться нельзя было. Оно до 8 версии вообще метаданные могло повредить при неудачном DDL (ибо хранились они в нетранзакционном хранилище с какого то бодуна) и undo/redo ему в этом никак не помогали. А уж про кривизну егошного диалекта SQL того времени я вообще промолчу. да байки это. у всяких гуглов и амазонов миллионы инстансов до версии 8 и не ломаются. у меня вот 5.6 прямо сейчас у гугла, ничего в плане метаданных не ломается. диалект да, тогда был скудный совсем, но зато уже тогда был более менее cost based оптимизатор. а у фб до сих пор все на рулах ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 12:49 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
H5N1, ну вот давай не будем про егошный оптимизатор в 3.x, 4.x да и 5.x он был полный отстой. В 8-ку ещё особо не тестил. В firebird тоже не ахти, но уже в 2.x он уже на порядок лучше 3.x, 4.x да и 5.x MySQL. H5N1фб до сих пор все на рулах это ложь. В Firebird правила применяются в тех случаях когда заведомо один метод доступа дешевле другого, или где невозможно сделать оценку (да статистики не так много как хотелось бы). В большинстве же случаев используется стоимостная оценка. H5N1у всяких гуглов и амазонов миллионы инстансов до версии 8 и не ломаются. у меня вот 5.6 прямо сейчас у гугла, ничего в плане метаданных не ломается. ломаются. Думаешь тебе все об этом говорить будут? Если что-то не сломалось, то это элемент везения. В большинстве случаев конечно ничего не ломается. Но когда наткнёшься на тот редкий случай будет больно ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 13:08 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
H5N1mysql бы просто установил бы лок на обновляемое полеБез комментариев PS Народ, не кормите тролля, он же треснет - а нам убирать за ним ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 13:42 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
hvladнам убирать за нимЕсли народ не против, то топик поедет в "сравнение". ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 14:23 |
|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, нет смысла, имхо ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2019, 14:28 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1560602]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 267ms |
total: | 460ms |
0 / 0 |