powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / execute_immediate
22 сообщений из 22, страница 1 из 1
execute_immediate
    #40003750
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день!

Плиз, не бейте ногами, потому что помимо освоения базы решаю еще тучу задачек.
Столкнулся вот с чем. В многопотоковом приложении Linux сделал автоматическое закрытие потоков, по факту обнаружения "смерти" родительского потока. Дочерних потоков.. ну прилично может быть.
При закрытии, дочерние потоки делают UDPATE одного и того же поля таблицы. Для этого использую конструкцию
transaction_start...
execute_immediate..
commit..

Получается так, что когда разом (с очень малым временнЫм разносом) к одному и тому же полю обращается десяток UPDATE - кто-нибудь обязательно валится в dead_lock. По MySQL помню такого не было, оно каким-то образом это разруливало. Хоть 100 запросов одновременно дай.
...
Рейтинг: 0 / 0
execute_immediate
    #40003760
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сама схема с убиемем и апдейтами предполагает наличие граблей, а то и вил. Уж молчу про тонны версий-мусора.

Пишите инсертами в лог табличку или даже просто в лог в плоский текстовый файл

pietro_888
валится в dead_lock
дэдлок, это не завал, это вполне себе рабочий момент, и да, его лучше не допускать конструктивно.
...
Рейтинг: 0 / 0
execute_immediate
    #40003766
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>и да, его лучше не допускать конструктивно
Если Можно, подробнее плиз! Вопрос в том, можно ли в принципе разрулить 100 "одновременных" update без возникновения ошибочного состояния?

>>дэдлок, это не завал, это вполне себе рабочий момент,
Т.е, если возник такой момент, ТО повторить запрос?

Ранее на другом проекте, я как-то приучился вычищать код до полного отсутствия таких ошибок.

>>Сама схема с убиемем и апдейтами предполагает наличие граблей, а то и вил. Уж молчу про тонны версий-мусора.
Это случай скорее исключительный чем рабочий. Но он помог обнаружить проблему.
...
Рейтинг: 0 / 0
execute_immediate
    #40003777
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, т.е что интересует: как так сделать чтобы запрос ждал освобождения метаданных прежде чем ломануться в update/commit, а именно так в MySQL и происходит.
В данном случае требуется делать только 1 запрос на транзакцию, а не 2 и более.
...
Рейтинг: 0 / 0
execute_immediate
    #40003798
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888,

чего? Каких ещё метаданных?

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

Как уже посоветовали лучше добавлять новую запись.
...
Рейтинг: 0 / 0
execute_immediate
    #40003799
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вангую. Пытаешься данные сессии php в базу данных запихнуть?
...
Рейтинг: 0 / 0
execute_immediate
    #40003807
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888
>>и да, его лучше не допускать конструктивно
Если Можно, подробнее плиз! Вопрос в том, можно ли в принципе разрулить 100 "одновременных" update без возникновения ошибочного состояния?
1. SELECT WITH LOCK + UPDATE (можно завернуть в EXECUTE BLOCK\PROCEDURE если нужен один запрос с клиента), тр-ция read committed, wait
2. UPDATE, read committed read consistency (fb4 only), wait
3. UPDATE, обработка лок-конфликтов на клиенте или в тм же EXECUTE BLOCK\PROCEDURE, wait\lock_timeout по вкусу

0. Лучше всего - не допускать массовых конфликтов обновления
...
Рейтинг: 0 / 0
execute_immediate
    #40003809
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
И да речь именно обо одной записи, а не об одном поле как у вас написано выше.
+100500
...
Рейтинг: 0 / 0
execute_immediate
    #40003814
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>вангую. Пытаешься данные сессии php в базу данных запихнуть?
Не...

>>Обновление конкурирующими транзакциями одной и той же записи архитектурный косяк вашего приложения. Не надо так делать.

Ну а вот к примеру, из счетчика считываются ЛОГи телеметрии, при этом списываются бабки с лицевого счета. Допустим в некоторый момент неопределенный вследствие неопределенного состояния сети передачи данных (городской вайфай), оно читает, и допустим некий идент произвел 20 операций списания. Это грубо говоря 20 UPDATE на один аккаунт. (UPDATE... set balance=(balance-tar))

И в это же самое время, чувак делает моментальный платеж через банкинг, и ужа совсем другой интерфейс в угодное ему время делает update этого же идента. (set balance=(balance+payment_sum))). Как тут избежать одновременного UPDATE от 2х никак не связанных источника?

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

Ну или иначе, ЛОГи считываются в несколько потоков, параллельным чтением.
...
Рейтинг: 0 / 0
execute_immediate
    #40003830
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888
Как тут избежать одновременного UPDATE

Ну так ответ очевиден, не использовать UPDATE
...
Рейтинг: 0 / 0
execute_immediate
    #40003832
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888,

обычно баланс считается как сумма приходов минус сумма расходов, а не хранится в одном поле. Есть кончено ещё хранимые агрегаты для ускорения расчётов, но это немного другая песня. И при вычислении хранимых агрегатов обычно конкуренции нет
...
Рейтинг: 0 / 0
execute_immediate
    #40003839
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888
На практике, пару-четверку раз в год система фиксирует именно такие совпадения.
4 раза в год можно и повторить операцию, это не массовые конфликты.

pietro_888
Ну или иначе, ЛОГи считываются в несколько потоков, параллельным чтением.
Где тут конфликты обновления ?
...
Рейтинг: 0 / 0
execute_immediate
    #40003845
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Где тут конфликты обновления ?
В этом примере как раз все "чисто", там Mysql, а он "хавает" это.

А в принципе - при чтении в 2 потока из одного устройства если в ЛОГах многократно повторяющиеся события от одного и того же идента, имеется вероятность что его обработка совпадет до милисекунды в этих потоках. (но конечно это будут разные события, но идент общий).

Суть то вопроса в том, что я случайно обнаружил, что если сделать на один идент одновременно 10 UPDATE часть из них вылетет в deadlock, вот и хочу понять с чем это едят.
...
Рейтинг: 0 / 0
execute_immediate
    #40003854
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888,

какой-то поток сознания - то у вас "ЛОГи считываются" и при этом конфликты обновления, потом оказывается, что это логи из устройств (мы тут как-бы про СУБД пишем и это не очевидно),
и на их основании нужно что-то куда-то записать и почему-то обязательно в одну и ту же запись (поле!) и т.д. и т.п.

Если есть необходимость записать пачку событий от одного источника в БД, при этом сами события появляются в разных потоках, - то самое тупое медленное -
это писать их все и сразу по мере обнаружения, создавая конкуренцию за одну запись на ровном месте.

Да, блокировочники "вырулят" это поставив всех в очередь.
Да, версионники тоже могут "рулить" (см выше как).
Но накой так делать - этого я понять не могу.

Почему прикладной софт не в состоянии вместо десятка последовательных апдейтов сделать один - этого я не разумею.
...
Рейтинг: 0 / 0
execute_immediate
    #40004029
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888
И в это же самое время, чувак делает моментальный платеж через банкинг, и ужа совсем другой интерфейс в угодное ему время делает update этого же идента. (set balance=(balance+payment_sum))). Как тут избежать одновременного UPDATE от 2х никак не связанных источника?
Избежать как обычно: записать в базу все в виде отдельных строк, потом следом проедет робот и вчерашне-позавчерашние записи схлопнет (трогать только тот диапазон, где нет текущих многопоточных вставок), а баланс выводить как сумму последнего агрегированного баланса плюс все приходы минус все расходы.
...
Рейтинг: 0 / 0
execute_immediate
    #40004032
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888
Суть то вопроса в том, что я случайно обнаружил, что если сделать на один идент одновременно 10 UPDATE часть из них вылетет в deadlock
Плохо, что случайно, это вполне очевидно всплывает на этапе проектирования. Но лучше поздно, чем когда оно уже внедрено.
...
Рейтинг: 0 / 0
execute_immediate
    #40004034
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyИзбежать как обычно

Ссылка на тему с агрегатами без блокировок ещё не находится в одной из прибитых?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
execute_immediate
    #40004126
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

да уж пора бы
https://www.sql.ru/forum/964534/hranimye-agregaty-bez-konfliktov-i-blokirovok-recept

но вообще 10-20 списаний, и всё в одну запись, апдейтом - это жесть. Если бы так люди бухгалтерию писали, ни у кого бы уже не было денег, совсем.
...
Рейтинг: 0 / 0
execute_immediate
    #40004145
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
10-20 списаний, и всё в одну запись, апдейтом - это жесть. Если бы так люди бухгалтерию писали, ни у кого бы уже не было денег, совсем.
Особенно у программистов.
...
Рейтинг: 0 / 0
execute_immediate
    #40004222
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а пра чо топег?
а хто аффтар?
(С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
execute_immediate
    #40004239
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

топег про какой-то execute immediate, который тут ни к селу, ни к городу (не говоря про Красную Армию).
...
Рейтинг: 0 / 0
execute_immediate
    #40004240
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
30.09.2020 12:46, kdv пишет:
> топег про какой-то execute immediate, который тут ни к селу, ни к городу (не говоря про Красную Армию).
>

ну я же коперайт поставил

правильный ответ на оба вопроса: КГ/АМ

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / execute_immediate
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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