powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / помогите разобраться с конфликтом в пишущих транзакциях
25 сообщений из 35, страница 1 из 2
помогите разобраться с конфликтом в пишущих транзакциях
    #39853463
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
простейший сервис на 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.
    public static function execsql($query,$param=null)
       {
           if (!self::IsConnected()) {self::Connect(); }           
           if (self::IsConnected()) 
           {
               $tr=ibase_trans(IBASE_WRITE | IBASE_NOWAIT | IBASE_COMMITTED | IBASE_REC_VERSION ,self::$connection);                
               $res=ibase_prepare(self::$connection,$tr,$query);
               if ($param<>null)
               {
                 if (!is_array($param))
                      {
                           $ret=ibase_execute($res, $param);     
                      }
                 else
                   {
                       array_unshift($param, $res); 
                       $ret = call_user_func_array('ibase_execute', $param);   
                       
                   }        
               }
               else
                 {
                       $ret=ibase_execute($res);  
                 }
                 
                   
               ibase_commit($tr);
               return $ret;
           }
           else
           {
               return -1;
           }
       } 




Проблема, я так понимаю в этом "IBASE_WRITE | IBASE_NOWAIT | IBASE_COMMITTED | IBASE_REC_VERSION", а именно в параметрах транзакции.
IBASE_WRITE - пишущая транзакция
IBASE_NOWAIT - действия при конфликте, при данном режиме, СУБД не ждет завершения конфликтующей транзакции, а просто выдает ошибку. пробовал WAIT, но система просто ждет и так же вываливается в ошибку.
IBASE_COMMITTED - т.е. в данной транзакции все изменения, которые были подтверждены другими транзакциями, будут видны немедленно + IBASE_REC_VERSION игнорирует non-committed версии, читая последнюю committed-версию.

Подскажите, какие параметры пишущей транзакции поставить, чтобы два одновременных запроса на изменение одной и той же записи не конфликтовали друг с другом? но и видели все последние изменения commit других транзакций.
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853468
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenestПодскажите, какие параметры пишущей транзакции поставить, чтобы два одновременных запроса
на изменение одной и той же записи не конфликтовали друг с другом?

Обломись. Базу надо переводить на Оракул или переделывать логику.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853469
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest IBASE_COMMITTED - т.е. в данной транзакции все изменения, которые были подтверждены другими транзакциями, будут видны немедленноНе знаю, но очень сомневаюсь. Такое называется READ_COMMITED


snakenestПодскажите, какие параметры пишущей транзакции поставить, чтобы два одновременных запроса на изменение одной и той же записи не конфликтовали друг с другом? но и видели все последние изменения commit других транзакций.
1. Не NOWAIT, а именно WAIT.
2. READ_COMMITED + REC_VERSION.
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853470
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock,

автор1. Не NOWAIT, а именно WAIT.

при таком варианте, просто ждет, и все равно вылетает ошибка

авторНе знаю, но очень сомневаюсь. Такое называется READ_COMMITED
IBASE_COMMITTED - это оно и есть
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853471
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovsnakenestПодскажите, какие параметры пишущей транзакции поставить, чтобы два одновременных запроса
на изменение одной и той же записи не конфликтовали друг с другом?

Обломись. Базу надо переводить на Оракул или переделывать логику.


Oracle - хороший вариант, но лучше тогда на PostgreSQL

"или переделывать логику" ? как?
Пришли два запроса на http, одновременно, сервер запустил два потока, работают они одновременно, и оба запроса обновляют одну и туже запись.
Переписать Apache, можно, но долго. Налаживать взаимодействия между двумя процессами PHP - как?
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853472
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest"или переделывать логику" ? как?

Убрать вот это самое "оба запроса обновляют одну и туже запись".
Ибо что-то протухло в этой консерватории.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853474
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovsnakenest"или переделывать логику" ? как?

Убрать вот это самое "оба запроса обновляют одну и туже запись".
Ибо что-то протухло в этой консерватории.


т.е. выполнение одновременного Update одной записи - для firebird это невозможно ни при каких обстоятельствах ?
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853476
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenestвыполнение одновременного Update одной записи - для firebird это невозможно ни при каких
обстоятельствах ?

ДА!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853478
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest,

"логи" указывают на одну и ту же тр-цию конкурента. Т.е. либо у тебя 3 писателя, либо ты не те логи показываешь.

Далее, в запросе два маркера пар-ров, в логе видно что массив пар-ров из 3-х эл-тов.

И основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый ?
Понятие lost update тебе знакомо ?

Обработка конфликта обновления обычно состоит из :
- откат тр-ции
- старт новой тр-ции
- перечитывание записи
- попытка апдейта
- проверка ошибки, коммит или всё сначала

Это оптимистичный подход, когда конфликты не часто случаются.
Некоторые СУБД в некоторых (не всех!) случаях применяют этот алгоритм самостоятельно.

Можно применить пессимистичный подход - заблокировать запись (select with lock в wait тр-ции) и потом её обновлять.
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853481
snakenest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladsnakenest,

"логи" указывают на одну и ту же тр-цию конкурента. Т.е. либо у тебя 3 писателя, либо ты не те логи показываешь.

Далее, в запросе два маркера пар-ров, в логе видно что массив пар-ров из 3-х эл-тов.

И основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый ?
Понятие lost update тебе знакомо ?

Обработка конфликта обновления обычно состоит из :
- откат тр-ции
- старт новой тр-ции
- перечитывание записи
- попытка апдейта
- проверка ошибки, коммит или всё сначала

Это оптимистичный подход, когда конфликты не часто случаются.
Некоторые СУБД в некоторых (не всех!) случаях применяют этот алгоритм самостоятельно.

Можно применить пессимистичный подход - заблокировать запись (select with lock в wait тр-ции) и потом её обновлять.

Да, получается три одновременно пришедших запроса "терзают" одну и туже запись. Первый выполнился без ошибок и в логах чисто, два оставшихся выполнились с ошибкой.

Три параметра, это особенности этого вызова:

Код: php
1.
2.
array_unshift($param, $res); 
$ret = call_user_func_array('ibase_execute', $param);



первый параметр это ссылка на ресурс с транзакцией.


hvladИ основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый ?
Да.
И поэтому я решил проблему изменив запрос на
"update webdata set fvalue=? where idWebCome=29164 and fname=? and fvalue is null"
тогда при срабатывании первого апдейта, остальные просто не могу обновить так как не срабатывает условие.

Но тут вопрос не в конкретном этом запросе. А именно, какие параметры пишущей транзакции позволят избежать блокировки при одновременном изменении одной и тойже записи.
Не ужели такое невозможно в Firebird?
Ведь он выдает deadlock, т.е. перед тем как произвести действия, проверяет и видит что прямо вот сейчас она уже меняется. Т.е. нельзя не выдавать deadlock, а просто поставить транзакцию в очередь и дождавшись окончания первой выполнить следующую?

По логике, так работать должен WAIT, но по факту это просто зависание и выдача того же deadlock только чуть позже, и при этом транзакции которая мешала, уже нет, она уже завершилась!
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853482
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenesthvladИ основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый
?
Да.
Значит и первый может забить на то, что напишет второй. Так в чём проблема-то? Не прошёл
update, так не прошёл. Какие именно данные будут в таблице - твоей задаче без разницы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853484
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenesthvladИ основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый ?
Да.Ответ не правильный, думай ещё.
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853487
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenestт.е. выполнение одновременного Update одной записи - для firebird это невозможно ни при каких обстоятельствах ?
это нормально для любой СУБД.
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853501
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snakenest,

не плохо бы
- при ошибке ibase_execute откатывать транзакцию
- проверять результат ibase_commit
- познакомиться с PSR-1, PSR-2
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853630
bsv9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Транзакции с параметрами READ WRITE READ COMMITTED NO RECORD_VERSION
WAIT работают без блокировок, ожидая освобождение и перезаписывая данные друг друга.
Источник .
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853674
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело не в транзакциях, дело в консерватории. Ни оракл, ни потгрес тут не поможет. Без выкидывания апдейтов этот паровоз с места не сдвинется.
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853699
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bsv9Транзакции с параметрами READ WRITE READ COMMITTED NO RECORD_VERSION
WAIT работают без блокировок, ожидая освобождение и перезаписывая данные друг друга.

Источник несколько преувеличивает. Это работает для двух транзакций. На трёх, как у
аффтара, получится тот же облом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853793
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЗначит и первый может забить на то, что напишет второй. Так в чём проблема-то?

вот-вот.

как вариант - сделать обновление данных тут через SP либо EB, которые будут дёргать "in autonomous transaction".

а обновятся данные по факту или нет - всем пофигу, иногда будут обновляться.
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853800
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа обновятся данные по факту или нет - всем пофигуЗачем тогда вообще обновлять?
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853817
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky,

а вот не знаю....

но предположить могу

допустим, задача - примерно как пользовательский форум.
или онлайн магазин.

где какой-то аггрегат (количество постов, остаток SKU) изменяется несколько раз в секунду.

посетителя сайта - не игроки на бирже, они в тысячных долях секунды не оперируют.
для них - корректность агрегата на последние плюс минус 60 секунд - достаточная точность
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853862
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochдопустим, задача - примерно как пользовательский форум.
или онлайн магазин.
тогда поменять FB на MySQL без транзакций. Пусть они переписывают любые изменения как попало (как в dbf).
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853863
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

а он уже с транзакциями, это он в 3-й версии был такой, сейчас он менее удивительный
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39853880
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

без транзакций MySQL и сейчас есть. Там от движка зависит. Хотя сейчас по умолчанию транзакционный движок, но можно выбрать и другой.
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39854103
H5N1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа он уже с транзакциями, это он в 3-й версии был такой, сейчас он менее удивительный

в 3й версии там уже все было на порядок два выше интербейза. и innodb енжин был, с его полноценными undo и redo логами, с нормальным консистентным чтением на read comitted, единым кешем и без сборки мусора.
...
Рейтинг: 0 / 0
помогите разобраться с конфликтом в пишущих транзакциях
    #39854107
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
йо, ты логин свой просрал что ле?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / помогите разобраться с конфликтом в пишущих транзакциях
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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