powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / ANN Выпущен Firebird 4!
21 сообщений из 371, страница 15 из 15
ANN Выпущен Firebird 4!
    #40119340
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка
hvladпропущено...
Чем два старых не угодили ?


В смысле RC_RO и снапшот?Нет, record_version и no_record_version
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40119347
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
Старый плюшевый мишка
пропущено...


В смысле RC_RO и снапшот?
Нет, record_version и no_record_version


Если честно, мне никогда в жизни не приходило в голову использовать no_record_version. Для чтения списков документов-событий оно не надо, а действия, не справочный просмотр, со строкой всегда выполнял в снапшоте. Возможно я что-то упустил в этой жизни :)
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128251
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv
Ибо у меня нет данных о полезности этого режима.


В процессе изучения работы с тамаутом транзакций (isc_tpb_lock_timeout) обнаружил интересную особенность READ CONSISTENCY в случае обновления одной и той же записи в двух конкурирующих транзакциях.

Пример. Транзакция 1 обновила запись, не завершилась. Транзакция 2 обновляет, встает в ожидание. Транзакция 1 делает COMMIT (успевает до времени таймаута). После этого транзакция 2 продолжает работу.

В 3-ке после коммита транзакции 1 транзакция 2 завершается с deadlock-ом, что делает использование таймаута абсолютно бесполезным. И лишь no_rec_version позволяет работать с таймаутом так, как от него ожидаешь.

Получается, что READ CONSISTENCY с одной стороны, не имеет минусов no_rec_version, а с другой логично работает с таймаутом.

Если это не так, поправьте...
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128253
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там мини-откат и повторение оператора внутри, как у оракула.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128331
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggory,

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

- при конкурирующих апдейтах и коммите первой транзакции вторая ДОЛЖНА получить deadlock. Потому что обновляемая второй транзакцией запись "уже не та". Собственно, по правилам версионника у записи может существовать только ОДНА не-коммиттед версия. И апдейт из второй транзакции может пройти без дедлока только если первая завершилась роллбэком, т.е. отменила свои изменения.

как-то так.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128397
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv

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


У меня в 3-ке транзакция isc_tpb_lock_timeout=1 живет бесконечно долго (см.картинку). Всё-таки в названии параметра ключевым является слово lock . Т.е., как я понимаю, если запустили и никаких блокировок нет, то транзакция не завершается. А таймаут используется тогда, когда возникает конфликт.

Я планировал использовать транзакции с таймаутом для устранения блокировок при обновлении хранимых агрегатов. Знаю и на форуме есть примеры, как можно обходить блокировки для решения этой задачи. Но в целом это громоздко. Лучше, если бы эту проблему решал сервер.

kdv

- при конкурирующих апдейтах и коммите первой транзакции вторая ДОЛЖНА получить deadlock. Потому что обновляемая второй транзакцией запись "уже не та". Собственно, по правилам версионника у записи может существовать только ОДНА не-коммиттед версия. И апдейт из второй транзакции может пройти без дедлока только если первая завершилась роллбэком, т.е. отменила свои изменения.


Для Snapshot-а абсолютно согласен, но для Read Committed немного не логично (в 3-ке и более старых версиях, в 4-ке гуд!)
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128422
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggory
В процессе изучения работы с тамаутом транзакций (isc_tpb_lock_timeout) обнаружил интересную особенность READ CONSISTENCY в случае обновления одной и той же записи в двух конкурирующих транзакциях.

Пример. Транзакция 1 обновила запись, не завершилась. Транзакция 2 обновляет, встает в ожидание. Транзакция 1 делает COMMIT (успевает до времени таймаута) . После этого транзакция 2 продолжает работу.

В 3-ке после коммита транзакции 1 транзакция 2 завершается с deadlock-ом, что делает использование таймаута абсолютно бесполезным.
В этом случае таймаут времени ожидания блокировки не наступил и было бы странно ожидать какого-либо эффекта от его наличия.
ggreggory
И лишь no_rec_version позволяет работать с таймаутом так, как от него ожидаешь
Было бы полезно озвучить ожидания. Боюсь, они несколько не соответствуют реальности :)

ggreggory
Получается, что READ CONSISTENCY с одной стороны, не имеет минусов no_rec_version, а с другой логично работает с таймаутом.
Я не понял - это претензия ? :)

Как уже сказали выше - READ CONSISTENCY имеет специальный алгоритм для обработки конфликтов обновления.
Если почитать документацию, то многое может стать более ясным.
Если это сложно или там непонятно написано - задавай вопросы, будем уточнять.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128424
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggory,

странная логика.
Код: plaintext
1.
2.
3.
      - MON$LOCK_TIMEOUT (lock timeout)
          -1: infinite wait
          0: no wait
          N: timeout N

Вот у нас было nowait и wait (бесконечный), а теперь wait на N секунд. Т.е. при блокировке wait через N секунд превращается (однократно) в nowait, выдает ошибку, и опять переключается в wait N.
И всё.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128426
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
таймаут, как я его понимаю, нужен для того чтобы транзакция не висела бесконечно "в случае чего". Допустим, если инициировавший транзакцию 1 ушел на обед, то без таймаута транзакция 2 висела бы пока первый не вернулся с обеда. Так что про "бесполезность" таймаута не надо.
Зачем путаешь человека ? Нет никакого "таймаута тр-ции" в вышеизложенном понимании.
Есть ограничение времени ожидания завершения конкурирующей тр-ции (lock_timeout) и это совсем другой таймаут.
kdv
при конкурирующих апдейтах и коммите первой транзакции вторая ДОЛЖНА получить deadlock. Потому что обновляемая второй транзакцией запись "уже не та". Собственно, по правилам версионника у записи может существовать только ОДНА не-коммиттед версия. И апдейт из второй транзакции может пройти без дедлока только если первая завершилась роллбэком, т.е. отменила свои изменения.
После оного дедлока вторая тр-ция обычно повторяет операцию, что включает в себя перечитывание свежих данных перед обновлением.
Что и делает fb4 в режиме read committed read consistency - совершенно автоматически и прозрачно для приложения.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128466
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladНет никакого "таймаута тр-ции" в вышеизложенном понимании.
я имел в виду конфликт конкурентного обновления в wait-транзакции.
hvladЕсть ограничение времени ожидания завершения конкурирующей тр-ции (lock_timeout) и это совсем другой таймаут.
про него мы тут и пишем. и ggreggory, и я.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128478
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

значит я тебя не так понял ;)
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128570
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
kdv
таймаут, как я его понимаю, нужен для того чтобы транзакция не висела бесконечно "в случае чего". Допустим, если инициировавший транзакцию 1 ушел на обед, то без таймаута транзакция 2 висела бы пока первый не вернулся с обеда. Так что про "бесполезность" таймаута не надо.
Зачем путаешь человека ? Нет никакого "таймаута тр-ции" в вышеизложенном понимании.
Есть ограничение времени ожидания завершения конкурирующей тр-ции (lock_timeout) и это совсем другой таймаут.
kdv
при конкурирующих апдейтах и коммите первой транзакции вторая ДОЛЖНА получить deadlock. Потому что обновляемая второй транзакцией запись "уже не та". Собственно, по правилам версионника у записи может существовать только ОДНА не-коммиттед версия. И апдейт из второй транзакции может пройти без дедлока только если первая завершилась роллбэком, т.е. отменила свои изменения.
После оного дедлока вторая тр-ция обычно повторяет операцию, что включает в себя перечитывание свежих данных перед обновлением.
Что и делает fb4 в режиме read committed read consistency - совершенно автоматически и прозрачно для приложения.


Скажите мне ради бога что я всё неправильно понял и что вторая транзакция не перекроет обновление в первой автоматически.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128572
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка
Скажите мне ради бога что я всё неправильно понял и что вторая транзакция не перекроет обновление в первой автоматически.
Считай, что вторая началась после коммита первой. Так лучше ?
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128590
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
Старый плюшевый мишка
Скажите мне ради бога что я всё неправильно понял и что вторая транзакция не перекроет обновление в первой автоматически.
Считай, что вторая началась после коммита первой. Так лучше ?


Баба Яга категорически против если решение о перекрытии принимает не пользователь, поглядевши - а что там изменилось. И речь не только об изменении одного поля двумя транзакциями. На принятие решения в общем случае влияют и другие поля.

Да, есть случаи когда это не только допустимо, но и удобно. Но не меньше случаев и когда недопустимо. На фоне управления типом RC транзакций чохом через конфиг это поле граблей в стране не только мнэээ... нубов.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128603
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка
Баба Яга категорически против если решение о перекрытии принимает не пользователь, поглядевши - а что там изменилось
Каким образом пользователь вообще влияет на порядок старта и коммита параллельных тр-ций ?
Если значения других полей важны - их указывают в where и проверяют rows affectted.

PS Не нужно искать чёрную кошку там, где её нет.
PPS Я всегда готов рассмотреть конкретные проблемные случаи и выяснить их реальную [не]допустимость.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128608
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad
Было бы полезно озвучить ожидания. Боюсь, они несколько не соответствуют реальности :)


Ожидание - решить проблемы блокировок не напрягаясь. Как я уже писал выше - страдания происходят при использовании каких-либо хранимых агрегатов, как-то: текущая задолженность клиента, остаток товара на складе, оборот по кассе за январь и т.п. Если одновременно два пользователя отгрузят один и тот же товар, один получит сообщение о блокировке.

Решение. Так как все обновления делаются в коротких пишущих транзакциях, которые успеваю сделать свою работу за 1-2 сек (я думаю у большинства так же), то можно поставить в параметрах пишущей транзакции таймаут 3 секунды и забыть о блокировках навсегда.

Как я пока вижу из тестов, в 4-ке с READ CONSISTENCY это возможно. А в 3-ке такой финт не работает:
  • при rec_version read committed ожидающая транзакция всё равно получает deadlock при commit-е первой
  • при no_rec_version read committed работа ожидающей транзакции продолжается и всё работает как ожидаешь... но блокировок становится в 10 раз больше на чтениях
hvlad
После оного дедлока вторая тр-ция обычно повторяет операцию, что включает в себя перечитывание свежих данных перед обновлением.
Что и делает fb4 в режиме read committed read consistency - совершенно автоматически и прозрачно для приложения.


Да-да! В 4-ке это как раз и работает как надо. А в 3-ке вместо повтора операции происходит отлуп.

Старый плюшевый мишка
Но не меньше случаев и когда недопустимо.


Тогда используйте Snapshot (isc_tpb_concurrency) - он работает как вы хотите. Как в 3-ке, так и в 4-ке. А вот read committed стал работать логичнее. Мои доводы см.выше.

Старый плюшевый мишка
На фоне управления типом RC транзакций чохом через конфиг это поле граблей в стране не только мнэээ... нубов.


Уже несколько раз писали тут, что на уровне коннекта старый вариант можно задать и работать как и прежде.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128617
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
Старый плюшевый мишка
Баба Яга категорически против если решение о перекрытии принимает не пользователь, поглядевши - а что там изменилось
Каким образом пользователь вообще влияет на порядок старта и коммита параллельных тр-ций ?
Если значения других полей важны - их указывают в where и проверяют rows affectted.

PS Не нужно искать чёрную кошку там, где её нет.
PPS Я всегда готов рассмотреть конкретные проблемные случаи и выяснить их реальную [не]допустимость.


Пользователь влияет на решение - актуальны его изменения после конфликта или нет. Когда речь о регистрации уже свершившегося факта - как говорится, нравится, не нравится, спи, моя красавица. Я тут как-то упоминал затяжное завершение много-много-позиционной складской операции. Если программировал гомосапиенс, то есть все изменения идут в приращениях, то применение для этого такой RC_RC вместо снапшота - это просто конфетка, снимающая серьёзный гемор. В руках же гомоэректуса - разрушительная сила. Когда же о планировании каких-то действий - бабушка надвое для всех гом. Скажем, резервирование товара на складе под планирующиеся отгрузки. Превышение количества резервов над имеющимся в наличии количеством - штука не так чтоб недопустимая, но нежелательная и требующая вдумчивого подхода. Скажем, отгрузка послезавтра, сегодня получается превышение. Но если человек знает, что завтра крест на пузе придёт ещё партия, то можно и рискнуть. Не каждый день фуры под Выборгом разбиваются. А если точно знает что не придёт, то утрётся или согласует с коллегой кому нужнее. Простейшее влияние другого поля - один формирует количество в отгрузке, другой меняет дату по объективным, не зависящим ни от одного ни от другого причинам. Правда, если он её изменит после формирования, то первый этого тоже не заметит или заметит поздно :) Ну, в общем-то, да, можно конечно по старинке вести все изменения в снапшотах и Read Commited как таковой пользовать для изменений в исключительных, хорошо продуманных случаях, тут вы с Григорием правы, но те же хранимые агрегаты если ведутся на лету, то триггерами в снапшотах, изменяющих "первичку". Короче, без переформатирования мозгов не обойтись, надо с этой мыселью переспать :)
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128622
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Старый плюшевый мишка
Превышение количества резервов над имеющимся в наличии количеством - штука не так чтоб недопустимая, но нежелательная и требующая вдумчивого подхода.


При READ CONSISTENCY если у вас выполняется не группа запросов, а один единственный, например, update или вызов процедуры, то он целиком будет как-бы в снапшоте, т.к. снимок создается на каждый статмент верхнего уровня. Всё что он порождает (все запросы внутри процедуры, все вызываемые ими триггеры) будут выполняться в этом снапшоте. При конфликтах рестартуется статмент самого верхнего уровня. Т.е. если у вас не верхнем уровне вызывается процедура, и процедура делает 100 updat-ов и на 100-ом updat-е встала, то после разблокировки предыдущие 99 откатятся и вся процедура выполнится заново. И логика не будет нарушена.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40128985
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggory
Как я уже писал выше - страдания происходят при использовании каких-либо хранимых агрегатов
Используй разделение записи. С ним значительно полегче.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40129026
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WildSery
ggreggory
Как я уже писал выше - страдания происходят при использовании каких-либо хранимых агрегатов
Используй разделение записи. С ним значительно полегче.


Если вы про это , то в этих методиках тоже есть минусы. Да и хотелось бы, чтобы проблемы блокировок решались легко и без затей на уровне сервера, а не на уровне разработчика.
...
Рейтинг: 0 / 0
ANN Выпущен Firebird 4!
    #40129029
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggory
Да и хотелось бы, чтобы проблемы блокировок решались легко и без затей на уровне сервера, а не на уровне разработчика.
а жопу вареньем не намазать?
...
Рейтинг: 0 / 0
21 сообщений из 371, страница 15 из 15
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / ANN Выпущен Firebird 4!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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