Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / помогите разобраться с конфликтом в пишущих транзакциях / 25 сообщений из 35, страница 1 из 2
24.08.2019, 11:18
    #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
24.08.2019, 12:18
    #39853468
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с конфликтом в пишущих транзакциях
snakenestПодскажите, какие параметры пишущей транзакции поставить, чтобы два одновременных запроса
на изменение одной и той же записи не конфликтовали друг с другом?

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


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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

Можно применить пессимистичный подход - заблокировать запись (select with lock в wait тр-ции) и потом её обновлять.
...
Рейтинг: 0 / 0
24.08.2019, 13:55
    #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
24.08.2019, 13:57
    #39853482
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с конфликтом в пишущих транзакциях
snakenesthvladИ основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый
?
Да.
Значит и первый может забить на то, что напишет второй. Так в чём проблема-то? Не прошёл
update, так не прошёл. Какие именно данные будут в таблице - твоей задаче без разницы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.08.2019, 14:48
    #39853484
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с конфликтом в пишущих транзакциях
snakenesthvladИ основной вопрос - ты уверен, что второй писатель может забить на то, что написал первый ?
Да.Ответ не правильный, думай ещё.
...
Рейтинг: 0 / 0
24.08.2019, 15:40
    #39853487
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с конфликтом в пишущих транзакциях
snakenestт.е. выполнение одновременного Update одной записи - для firebird это невозможно ни при каких обстоятельствах ?
это нормально для любой СУБД.
...
Рейтинг: 0 / 0
24.08.2019, 19:22
    #39853501
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите разобраться с конфликтом в пишущих транзакциях
snakenest,

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

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

вот-вот.

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

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

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

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

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

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

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

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

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

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


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