|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
Старый плюшевый мишка hvladпропущено... Чем два старых не угодили ? В смысле RC_RO и снапшот?Нет, record_version и no_record_version ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2021, 22:07 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
hvlad Старый плюшевый мишка пропущено... В смысле RC_RO и снапшот? Если честно, мне никогда в жизни не приходило в голову использовать no_record_version. Для чтения списков документов-событий оно не надо, а действия, не справочный просмотр, со строкой всегда выполнял в снапшоте. Возможно я что-то упустил в этой жизни :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2021, 22:48 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
kdv Ибо у меня нет данных о полезности этого режима. В процессе изучения работы с тамаутом транзакций (isc_tpb_lock_timeout) обнаружил интересную особенность READ CONSISTENCY в случае обновления одной и той же записи в двух конкурирующих транзакциях. Пример. Транзакция 1 обновила запись, не завершилась. Транзакция 2 обновляет, встает в ожидание. Транзакция 1 делает COMMIT (успевает до времени таймаута). После этого транзакция 2 продолжает работу. В 3-ке после коммита транзакции 1 транзакция 2 завершается с deadlock-ом, что делает использование таймаута абсолютно бесполезным. И лишь no_rec_version позволяет работать с таймаутом так, как от него ожидаешь. Получается, что READ CONSISTENCY с одной стороны, не имеет минусов no_rec_version, а с другой логично работает с таймаутом. Если это не так, поправьте... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2022, 22:52 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
Там мини-откат и повторение оператора внутри, как у оракула. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2022, 23:08 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
ggreggory, - таймаут, как я его понимаю, нужен для того чтобы транзакция не висела бесконечно "в случае чего". Допустим, если инициировавший транзакцию 1 ушел на обед, то без таймаута транзакция 2 висела бы пока первый не вернулся с обеда. Так что про "бесполезность" таймаута не надо. - при конкурирующих апдейтах и коммите первой транзакции вторая ДОЛЖНА получить deadlock. Потому что обновляемая второй транзакцией запись "уже не та". Собственно, по правилам версионника у записи может существовать только ОДНА не-коммиттед версия. И апдейт из второй транзакции может пройти без дедлока только если первая завершилась роллбэком, т.е. отменила свои изменения. как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 10:37 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
kdv - таймаут, как я его понимаю, нужен для того чтобы транзакция не висела бесконечно "в случае чего". Допустим, если инициировавший транзакцию 1 ушел на обед, то без таймаута транзакция 2 висела бы пока первый не вернулся с обеда. Так что про "бесполезность" таймаута не надо. У меня в 3-ке транзакция isc_tpb_lock_timeout=1 живет бесконечно долго (см.картинку). Всё-таки в названии параметра ключевым является слово lock . Т.е., как я понимаю, если запустили и никаких блокировок нет, то транзакция не завершается. А таймаут используется тогда, когда возникает конфликт. Я планировал использовать транзакции с таймаутом для устранения блокировок при обновлении хранимых агрегатов. Знаю и на форуме есть примеры, как можно обходить блокировки для решения этой задачи. Но в целом это громоздко. Лучше, если бы эту проблему решал сервер. kdv - при конкурирующих апдейтах и коммите первой транзакции вторая ДОЛЖНА получить deadlock. Потому что обновляемая второй транзакцией запись "уже не та". Собственно, по правилам версионника у записи может существовать только ОДНА не-коммиттед версия. И апдейт из второй транзакции может пройти без дедлока только если первая завершилась роллбэком, т.е. отменила свои изменения. Для Snapshot-а абсолютно согласен, но для Read Committed немного не логично (в 3-ке и более старых версиях, в 4-ке гуд!) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 13:32 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
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 имеет специальный алгоритм для обработки конфликтов обновления. Если почитать документацию, то многое может стать более ясным. Если это сложно или там непонятно написано - задавай вопросы, будем уточнять. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 14:31 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
ggreggory, странная логика. Код: plaintext 1. 2. 3.
Вот у нас было nowait и wait (бесконечный), а теперь wait на N секунд. Т.е. при блокировке wait через N секунд превращается (однократно) в nowait, выдает ошибку, и опять переключается в wait N. И всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 14:32 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
kdv таймаут, как я его понимаю, нужен для того чтобы транзакция не висела бесконечно "в случае чего". Допустим, если инициировавший транзакцию 1 ушел на обед, то без таймаута транзакция 2 висела бы пока первый не вернулся с обеда. Так что про "бесполезность" таймаута не надо. Есть ограничение времени ожидания завершения конкурирующей тр-ции (lock_timeout) и это совсем другой таймаут. kdv при конкурирующих апдейтах и коммите первой транзакции вторая ДОЛЖНА получить deadlock. Потому что обновляемая второй транзакцией запись "уже не та". Собственно, по правилам версионника у записи может существовать только ОДНА не-коммиттед версия. И апдейт из второй транзакции может пройти без дедлока только если первая завершилась роллбэком, т.е. отменила свои изменения. Что и делает fb4 в режиме read committed read consistency - совершенно автоматически и прозрачно для приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 14:35 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
hvladНет никакого "таймаута тр-ции" в вышеизложенном понимании. я имел в виду конфликт конкурентного обновления в wait-транзакции. hvladЕсть ограничение времени ожидания завершения конкурирующей тр-ции (lock_timeout) и это совсем другой таймаут. про него мы тут и пишем. и ggreggory, и я. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 15:41 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
kdv, значит я тебя не так понял ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 15:53 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
hvlad kdv таймаут, как я его понимаю, нужен для того чтобы транзакция не висела бесконечно "в случае чего". Допустим, если инициировавший транзакцию 1 ушел на обед, то без таймаута транзакция 2 висела бы пока первый не вернулся с обеда. Так что про "бесполезность" таймаута не надо. Есть ограничение времени ожидания завершения конкурирующей тр-ции (lock_timeout) и это совсем другой таймаут. kdv при конкурирующих апдейтах и коммите первой транзакции вторая ДОЛЖНА получить deadlock. Потому что обновляемая второй транзакцией запись "уже не та". Собственно, по правилам версионника у записи может существовать только ОДНА не-коммиттед версия. И апдейт из второй транзакции может пройти без дедлока только если первая завершилась роллбэком, т.е. отменила свои изменения. Что и делает fb4 в режиме read committed read consistency - совершенно автоматически и прозрачно для приложения. Скажите мне ради бога что я всё неправильно понял и что вторая транзакция не перекроет обновление в первой автоматически. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 19:24 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
Старый плюшевый мишка Скажите мне ради бога что я всё неправильно понял и что вторая транзакция не перекроет обновление в первой автоматически. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 19:29 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
hvlad Старый плюшевый мишка Скажите мне ради бога что я всё неправильно понял и что вторая транзакция не перекроет обновление в первой автоматически. Баба Яга категорически против если решение о перекрытии принимает не пользователь, поглядевши - а что там изменилось. И речь не только об изменении одного поля двумя транзакциями. На принятие решения в общем случае влияют и другие поля. Да, есть случаи когда это не только допустимо, но и удобно. Но не меньше случаев и когда недопустимо. На фоне управления типом RC транзакций чохом через конфиг это поле граблей в стране не только мнэээ... нубов. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 20:33 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
Старый плюшевый мишка Баба Яга категорически против если решение о перекрытии принимает не пользователь, поглядевши - а что там изменилось Если значения других полей важны - их указывают в where и проверяют rows affectted. PS Не нужно искать чёрную кошку там, где её нет. PPS Я всегда готов рассмотреть конкретные проблемные случаи и выяснить их реальную [не]допустимость. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 21:20 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
hvlad Было бы полезно озвучить ожидания. Боюсь, они несколько не соответствуют реальности :) Ожидание - решить проблемы блокировок не напрягаясь. Как я уже писал выше - страдания происходят при использовании каких-либо хранимых агрегатов, как-то: текущая задолженность клиента, остаток товара на складе, оборот по кассе за январь и т.п. Если одновременно два пользователя отгрузят один и тот же товар, один получит сообщение о блокировке. Решение. Так как все обновления делаются в коротких пишущих транзакциях, которые успеваю сделать свою работу за 1-2 сек (я думаю у большинства так же), то можно поставить в параметрах пишущей транзакции таймаут 3 секунды и забыть о блокировках навсегда. Как я пока вижу из тестов, в 4-ке с READ CONSISTENCY это возможно. А в 3-ке такой финт не работает:
hvlad После оного дедлока вторая тр-ция обычно повторяет операцию, что включает в себя перечитывание свежих данных перед обновлением. Что и делает fb4 в режиме read committed read consistency - совершенно автоматически и прозрачно для приложения. Да-да! В 4-ке это как раз и работает как надо. А в 3-ке вместо повтора операции происходит отлуп. Старый плюшевый мишка Но не меньше случаев и когда недопустимо. Тогда используйте Snapshot (isc_tpb_concurrency) - он работает как вы хотите. Как в 3-ке, так и в 4-ке. А вот read committed стал работать логичнее. Мои доводы см.выше. Старый плюшевый мишка На фоне управления типом RC транзакций чохом через конфиг это поле граблей в стране не только мнэээ... нубов. Уже несколько раз писали тут, что на уровне коннекта старый вариант можно задать и работать как и прежде. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 21:47 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
hvlad Старый плюшевый мишка Баба Яга категорически против если решение о перекрытии принимает не пользователь, поглядевши - а что там изменилось Если значения других полей важны - их указывают в where и проверяют rows affectted. PS Не нужно искать чёрную кошку там, где её нет. PPS Я всегда готов рассмотреть конкретные проблемные случаи и выяснить их реальную [не]допустимость. Пользователь влияет на решение - актуальны его изменения после конфликта или нет. Когда речь о регистрации уже свершившегося факта - как говорится, нравится, не нравится, спи, моя красавица. Я тут как-то упоминал затяжное завершение много-много-позиционной складской операции. Если программировал гомосапиенс, то есть все изменения идут в приращениях, то применение для этого такой RC_RC вместо снапшота - это просто конфетка, снимающая серьёзный гемор. В руках же гомоэректуса - разрушительная сила. Когда же о планировании каких-то действий - бабушка надвое для всех гом. Скажем, резервирование товара на складе под планирующиеся отгрузки. Превышение количества резервов над имеющимся в наличии количеством - штука не так чтоб недопустимая, но нежелательная и требующая вдумчивого подхода. Скажем, отгрузка послезавтра, сегодня получается превышение. Но если человек знает, что завтра крест на пузе придёт ещё партия, то можно и рискнуть. Не каждый день фуры под Выборгом разбиваются. А если точно знает что не придёт, то утрётся или согласует с коллегой кому нужнее. Простейшее влияние другого поля - один формирует количество в отгрузке, другой меняет дату по объективным, не зависящим ни от одного ни от другого причинам. Правда, если он её изменит после формирования, то первый этого тоже не заметит или заметит поздно :) Ну, в общем-то, да, можно конечно по старинке вести все изменения в снапшотах и Read Commited как таковой пользовать для изменений в исключительных, хорошо продуманных случаях, тут вы с Григорием правы, но те же хранимые агрегаты если ведутся на лету, то триггерами в снапшотах, изменяющих "первичку". Короче, без переформатирования мозгов не обойтись, надо с этой мыселью переспать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 22:38 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
Старый плюшевый мишка Превышение количества резервов над имеющимся в наличии количеством - штука не так чтоб недопустимая, но нежелательная и требующая вдумчивого подхода. При READ CONSISTENCY если у вас выполняется не группа запросов, а один единственный, например, update или вызов процедуры, то он целиком будет как-бы в снапшоте, т.к. снимок создается на каждый статмент верхнего уровня. Всё что он порождает (все запросы внутри процедуры, все вызываемые ими триггеры) будут выполняться в этом снапшоте. При конфликтах рестартуется статмент самого верхнего уровня. Т.е. если у вас не верхнем уровне вызывается процедура, и процедура делает 100 updat-ов и на 100-ом updat-е встала, то после разблокировки предыдущие 99 откатятся и вся процедура выполнится заново. И логика не будет нарушена. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 23:21 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
ggreggory Как я уже писал выше - страдания происходят при использовании каких-либо хранимых агрегатов ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 13:06 |
|
ANN Выпущен Firebird 4!
|
|||
---|---|---|---|
#18+
WildSery ggreggory Как я уже писал выше - страдания происходят при использовании каких-либо хранимых агрегатов Если вы про это , то в этих методиках тоже есть минусы. Да и хотелось бы, чтобы проблемы блокировок решались легко и без затей на уровне сервера, а не на уровне разработчика. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2022, 14:42 |
|
|
start [/forum/topic.php?answer_author=%D0%A1%D1%82%D0%B0%D1%80%D1%8B%D0%B9+%D0%BF%D0%BB%D1%8E%D1%88%D0%B5%D0%B2%D1%8B%D0%B9+%D0%BC%D0%B8%D1%88%D0%BA%D0%B0&do_answer=40128590&fid=40&msg=40128590&tid=1559839]: |
0ms |
get settings: |
23ms |
get forum list: |
26ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
469ms |
get forum data: |
3ms |
get page messages: |
2372ms |
get tp. blocked users: |
1ms |
others: | 350ms |
total: | 3290ms |
0 / 0 |