|
помогите разобраться с конфликтом в пишущих транзакциях
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=40&fpage=20&tid=1560602]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
102ms |
get tp. blocked users: |
2ms |
others: | 263ms |
total: | 458ms |
0 / 0 |