|
execute_immediate
|
|||
---|---|---|---|
#18+
Всем добрый день! Плиз, не бейте ногами, потому что помимо освоения базы решаю еще тучу задачек. Столкнулся вот с чем. В многопотоковом приложении Linux сделал автоматическое закрытие потоков, по факту обнаружения "смерти" родительского потока. Дочерних потоков.. ну прилично может быть. При закрытии, дочерние потоки делают UDPATE одного и того же поля таблицы. Для этого использую конструкцию transaction_start... execute_immediate.. commit.. Получается так, что когда разом (с очень малым временнЫм разносом) к одному и тому же полю обращается десяток UPDATE - кто-нибудь обязательно валится в dead_lock. По MySQL помню такого не было, оно каким-то образом это разруливало. Хоть 100 запросов одновременно дай. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 08:22 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
Сама схема с убиемем и апдейтами предполагает наличие граблей, а то и вил. Уж молчу про тонны версий-мусора. Пишите инсертами в лог табличку или даже просто в лог в плоский текстовый файл pietro_888 валится в dead_lock ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 08:52 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
>>и да, его лучше не допускать конструктивно Если Можно, подробнее плиз! Вопрос в том, можно ли в принципе разрулить 100 "одновременных" update без возникновения ошибочного состояния? >>дэдлок, это не завал, это вполне себе рабочий момент, Т.е, если возник такой момент, ТО повторить запрос? Ранее на другом проекте, я как-то приучился вычищать код до полного отсутствия таких ошибок. >>Сама схема с убиемем и апдейтами предполагает наличие граблей, а то и вил. Уж молчу про тонны версий-мусора. Это случай скорее исключительный чем рабочий. Но он помог обнаружить проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 09:03 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
Ну, т.е что интересует: как так сделать чтобы запрос ждал освобождения метаданных прежде чем ломануться в update/commit, а именно так в MySQL и происходит. В данном случае требуется делать только 1 запрос на транзакцию, а не 2 и более. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 09:27 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
pietro_888, чего? Каких ещё метаданных? Обновление конкурирующими транзакциями одной и той же записи архитектурный косяк вашего приложения. Не надо так делать. И да речь именно обо одной записи, а не об одном поле как у вас написано выше. Как уже посоветовали лучше добавлять новую запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 09:56 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
вангую. Пытаешься данные сессии php в базу данных запихнуть? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 09:57 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
pietro_888 >>и да, его лучше не допускать конструктивно Если Можно, подробнее плиз! Вопрос в том, можно ли в принципе разрулить 100 "одновременных" update без возникновения ошибочного состояния? 2. UPDATE, read committed read consistency (fb4 only), wait 3. UPDATE, обработка лок-конфликтов на клиенте или в тм же EXECUTE BLOCK\PROCEDURE, wait\lock_timeout по вкусу 0. Лучше всего - не допускать массовых конфликтов обновления ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 10:10 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
Симонов Денис И да речь именно обо одной записи, а не об одном поле как у вас написано выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 10:11 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
>>вангую. Пытаешься данные сессии php в базу данных запихнуть? Не... >>Обновление конкурирующими транзакциями одной и той же записи архитектурный косяк вашего приложения. Не надо так делать. Ну а вот к примеру, из счетчика считываются ЛОГи телеметрии, при этом списываются бабки с лицевого счета. Допустим в некоторый момент неопределенный вследствие неопределенного состояния сети передачи данных (городской вайфай), оно читает, и допустим некий идент произвел 20 операций списания. Это грубо говоря 20 UPDATE на один аккаунт. (UPDATE... set balance=(balance-tar)) И в это же самое время, чувак делает моментальный платеж через банкинг, и ужа совсем другой интерфейс в угодное ему время делает update этого же идента. (set balance=(balance+payment_sum))). Как тут избежать одновременного UPDATE от 2х никак не связанных источника? На практике, пару-четверку раз в год система фиксирует именно такие совпадения. Ну или иначе, ЛОГи считываются в несколько потоков, параллельным чтением. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 10:15 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
pietro_888 Как тут избежать одновременного UPDATE Ну так ответ очевиден, не использовать UPDATE ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 10:33 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
pietro_888, обычно баланс считается как сумма приходов минус сумма расходов, а не хранится в одном поле. Есть кончено ещё хранимые агрегаты для ускорения расчётов, но это немного другая песня. И при вычислении хранимых агрегатов обычно конкуренции нет ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 10:34 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
pietro_888 На практике, пару-четверку раз в год система фиксирует именно такие совпадения. pietro_888 Ну или иначе, ЛОГи считываются в несколько потоков, параллельным чтением. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 10:42 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
>>Где тут конфликты обновления ? В этом примере как раз все "чисто", там Mysql, а он "хавает" это. А в принципе - при чтении в 2 потока из одного устройства если в ЛОГах многократно повторяющиеся события от одного и того же идента, имеется вероятность что его обработка совпадет до милисекунды в этих потоках. (но конечно это будут разные события, но идент общий). Суть то вопроса в том, что я случайно обнаружил, что если сделать на один идент одновременно 10 UPDATE часть из них вылетет в deadlock, вот и хочу понять с чем это едят. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 10:54 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
pietro_888, какой-то поток сознания - то у вас "ЛОГи считываются" и при этом конфликты обновления, потом оказывается, что это логи из устройств (мы тут как-бы про СУБД пишем и это не очевидно), и на их основании нужно что-то куда-то записать и почему-то обязательно в одну и ту же запись (поле!) и т.д. и т.п. Если есть необходимость записать пачку событий от одного источника в БД, при этом сами события появляются в разных потоках, - то самое тупое медленное - это писать их все и сразу по мере обнаружения, создавая конкуренцию за одну запись на ровном месте. Да, блокировочники "вырулят" это поставив всех в очередь. Да, версионники тоже могут "рулить" (см выше как). Но накой так делать - этого я понять не могу. Почему прикладной софт не в состоянии вместо десятка последовательных апдейтов сделать один - этого я не разумею. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 11:15 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
pietro_888 И в это же самое время, чувак делает моментальный платеж через банкинг, и ужа совсем другой интерфейс в угодное ему время делает update этого же идента. (set balance=(balance+payment_sum))). Как тут избежать одновременного UPDATE от 2х никак не связанных источника? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 15:34 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
pietro_888 Суть то вопроса в том, что я случайно обнаружил, что если сделать на один идент одновременно 10 UPDATE часть из них вылетет в deadlock ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 15:37 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
Ivan_PisarevskyИзбежать как обычно Ссылка на тему с агрегатами без блокировок ещё не находится в одной из прибитых? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 15:41 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, да уж пора бы https://www.sql.ru/forum/964534/hranimye-agregaty-bez-konfliktov-i-blokirovok-recept но вообще 10-20 списаний, и всё в одну запись, апдейтом - это жесть. Если бы так люди бухгалтерию писали, ни у кого бы уже не было денег, совсем. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 19:39 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
kdv 10-20 списаний, и всё в одну запись, апдейтом - это жесть. Если бы так люди бухгалтерию писали, ни у кого бы уже не было денег, совсем. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2020, 21:51 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
а пра чо топег? а хто аффтар? (С) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 11:39 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
Мимопроходящий, топег про какой-то execute immediate, который тут ни к селу, ни к городу (не говоря про Красную Армию). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 12:46 |
|
execute_immediate
|
|||
---|---|---|---|
#18+
30.09.2020 12:46, kdv пишет: > топег про какой-то execute immediate, который тут ни к селу, ни к городу (не говоря про Красную Армию). > ну я же коперайт поставил правильный ответ на оба вопроса: КГ/АМ Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2020, 12:50 |
|
|
start [/forum/topic.php?fid=40&fpage=11&tid=1560241]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
5ms |
track hit: |
78ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 210ms |
0 / 0 |