Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / update conflicts with concurrent update / 14 сообщений из 14, страница 1 из 1
01.10.2014, 18:26
    #38763821
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
Объясните, пожалуйста фразу
авторОдна транзакция стартует и модифицирует запись, и вторая пытается модифицировать ту же запись. Поскольку более одной не-committed версии для записи существовать не может, вторая транзакция получит сообщение:

deadlock. update conflicts with concurrent update.

У меня две транзакции модифицируют один и тот же набор данных. Обе транзакции read_commited, rec_version.

В моем понимании, что если две транзакции будут модифицировать одну и ту же запись, то вторая, т.к. нет флага nowait, просто будет ожидать пока не завершится первая. В основном так и получается, но иногда получаю ошибкуавторdeadlock. update conflicts with concurrent updateЧего я не понимаю?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
01.10.2014, 18:28
    #38763826
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
_Vasilisk_вторая, т.к. нет флага nowait, просто будет ожидать пока не завершится
первая.
И если ты завершилась коммитом - выкинет ошибку, которую ты и наблюдаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.10.2014, 18:30
    #38763831
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
Dimitry SibiryakovИ если ты завершилась коммитом - выкинет ошибку, которую ты и наблюдаешь.Твою дивизию. Спасибо большое.
...
Рейтинг: 0 / 0
01.10.2014, 18:50
    #38763858
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
_Vasilisk_Твою дивизию.
Тут тебе не оракул, автоматические мини-откаты отсутствуют.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.10.2014, 19:03
    #38763873
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
Dimitry SibiryakovТут тебе не оракул, автоматические мини-откаты отсутствуют.Все таки идея не совсем понятна. Ну полезли мы модифицировать запись, ну подождали. Но почему бы не отмодифицировать эту запись когда она разблокируется? Получается, что смысла убирать флаг nowait нет никакого? Он актуален только при Rollback?
...
Рейтинг: 0 / 0
01.10.2014, 19:08
    #38763874
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
_Vasilisk_Но почему бы не отмодифицировать эту запись когда она разблокируется?

Чтобы не приходилось в саппорте отвечать на вопросы криворуких разработчиков о lost update.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.10.2014, 19:28
    #38763898
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
особо страждующие тихой перезаписи могут открыть для себя режим no_record_version. А может и заодно откроют сопутствующие ему нюансы :-)
...
Рейтинг: 0 / 0
01.10.2014, 20:14
    #38763943
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
dimitrособо страждующие тихой перезаписи могут открыть для себя режим no_record_versionIBaseрежим no record_version, вызывающий блокировки по чтению non-committed данныхБлагодарю :)
...
Рейтинг: 0 / 0
01.10.2014, 20:58
    #38763987
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
_Vasilisk_Получается, что смысла убирать флаг nowait нет никакого? Он актуален только при Rollback?
грубо говоря, wait может иметь смысл при snapshot (concurrency) или table reserving (consistency). Для read committed wait только вреден. Вообще wait плох тем, что он приводит к повисанию приложения.
Потому и ввели в 2.0 параметр транзакции [LOCK TIMEOUT seconds].
...
Рейтинг: 0 / 0
02.10.2014, 02:46
    #38764154
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
kdvгрубо говоря, wait может иметь смысл при snapshot (concurrency) или table reserving (consistency). Для read committed wait только вреденЯсно
kdvВообще wait плох тем, что он приводит к повисанию приложения.Мне это не критично. У меня многопоточный сервис. Поток может подождать, сколько нужно
kdvПотому и ввели в 2.0 параметр транзакции [LOCK TIMEOUT seconds].У меня IB. Но не суть.

В общем из того, что я тут наслушался и начитался на ibase, остановился на такой архитекутуре
1) Транзакции read_commited, rec_version
2) Если возникает ошибка isc_update_conflict запрос выполняется повторно.
3) Т.к. транзакция wait, то повторное выполнение происходит только после завершения конкурентной транзакции

И все таки смысла isc_update_conflict я не понял. "Чтобы не приходилось в саппорте отвечать на вопросы" - как-то неубедительно звучит
...
Рейтинг: 0 / 0
02.10.2014, 03:26
    #38764162
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
_Vasilisk_1) Транзакции read_commited, rec_version
ну слава богу!

_Vasilisk_И все таки смысла isc_update_conflict я не понял. "Чтобы не приходилось в саппорте отвечать на вопросы" - как-то неубедительно звучит
есть две модели обработки такого конфликта

Допустим, есть А, делает update, и есть Б, делает update в wait.

1. при commit транзакции А транзакция Б обломится, т.е. получит ошибку lock conflict ибо конкурирующая транзакция ИЗМЕНИЛА данные, а на какие, хрен его знает, поэтому транзации Б запрещается их перезаписывать. Так работает InterBase и Firebird

2. при commit транзакции А транзакция Б перепишет сделанные ею изменения, и не получит ошибки о конкурирующем update. Так, вроде бы, сделано в Оракле.

На клиентской стороне у ДатаСетов бывают аналогии этому поведению. Не в смысле конкурентного обновления, а в смысле убивания изменений, сделанных предыдущей транзакцией. То есть, перед входом в режим редактирования запоминаются столбцы строки, а при отправке update формируется запрос, который не проверяет ничего, проверяет изменения, или проверяет все.
upWhereKeyOnly - проверяется только ID записи, на остальное кладется болт
upWhereChanged - проверяются столбцы, которые менялись, плюс ID. Если старые значения уже не те, что были считаны перед переходом в режим редактирования, выдается ошибка.
upWhereAll - тут контролируются все столбцы, независимо, менялись они при редактировании, или нет. Главное, чтобы все столбцы имели те же значения при update, что и до "входа" в режим редактирования.

Если в отношении клиентской стороны (т.е. sql запросов) можно выбирать - класть болт на изменения или наоборот, их учитывать, то в отношении конкурирующих транзакций сервер поступает всегда единообразно, так, как в нем была реализована модель обработки таких конфликтов.

Также, не надо забывать, что транзакция snapshot при получении конфликта конкурентного update хоть в wait, хоть в nowait, не может "повторить update", т.к. в силу своего уровня изолированности она физически не может увидеть эти изменения, и соответственно, их переписать.

То есть, если для RC поведение Оракла еще бы имело смысл (например, типа, "давайте так же сделаем в ФБ"), то для snapshot - увы, никак и никогда. То есть, поведение обработки конфликта в ФБ в RC соответствует таковому в snapshot.
Однако, отлуп в ФБ в RC считается логичным, потому что если Б повисла на конфликте, то она до завершения А коммитом не в состоянии "увидеть" что изменила А. И это является индикацией, что до изменений Б кто-то уже успел запись изменить. Благо, как я уже сказал, RC по такой ошибке позволяет перечитать данные закоммиченные транзакцией А, и дальше решить, повторять update, или нет.
...
Рейтинг: 0 / 0
02.10.2014, 09:51
    #38764334
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
kdv2. при commit транзакции А транзакция Б перепишет сделанные ею изменения, и не получит ошибки о конкурирующем update. Так, вроде бы, сделано в Оракле.ничего там такого нет, не надо придумывать.
...
Рейтинг: 0 / 0
02.10.2014, 11:51
    #38764537
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
roadsterничего там такого нет
Есть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.10.2014, 15:22
    #38764994
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
update conflicts with concurrent update
Dimitry Sibiryakovroadsterничего там такого нет
Есть.если очень хочется, то есть.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / update conflicts with concurrent update / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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