|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpА если он создаётся внутри обновляющей транзакции, то другие пользователи его всё равно не увидят до тех пор пока транзакция не завершится - он бесполезен.Как раз увидят, если попытаются создать такую же запись. Или обновить существующую. UPDATE OR INSERT, например, упадет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 12:52 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
YuRockalekcvpА если он создаётся внутри обновляющей транзакции, то другие пользователи его всё равно не увидят до тех пор пока транзакция не завершится - он бесполезен.Как раз увидят, если попытаются создать такую же запись. Или обновить существующую. UPDATE OR INSERT, например, упадет. Ага, только мне нужно чтобы они и в другие таблицы не могли добавлять записи, ссылающиеся на эту. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 12:54 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpАга, только мне нужно чтобы они и в другие таблицы не могли добавлять записи, ссылающиеся на эту.Ну правильно! Вначале добавляешь такой флаг, если получилось - делаешь все дальнейшие обновления по таблицам, если не получилось - полный отлуп. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 12:58 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpмне нужно чтобы они и в другие таблицы не могли добавлять записи, ссылающиеся на этуА, я понял. Ну сделай триггер в каждой такой таблице, который будет делать этот UPDATE OR INSERT флага. Ужас какой-то, конечно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 13:00 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
YuRockсделай триггер в каждой такой таблице, который будет делать этот UPDATE OR INSERT флагаУчти, в этом случае обновлять данные в этих таблицах сможет только одна транзакция. Смахивает на монопольное открытие dbf. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 13:02 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvp1. Добавил в таблице групп поле grplock;Вынеси его в другую таблицу с контролем уникальности. Смог добавить флаг - можно работать. Не смог - занято. Чтобы проверять зомби - добавь туда же CONNECTION ID того, кто добавил флаг. Дальше рассказывать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 13:07 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
hvladalekcvp1. Добавил в таблице групп поле grplock;Вынеси его в другую таблицу с контролем уникальности. Смог добавить флаг - можно работать. Не смог - занято. Чтобы проверять зомби - добавь туда же CONNECTION ID того, кто добавил флаг. Дальше рассказывать ? 1. Зачем в таблицу уникальности? Он же к ID группы привязан, на другие группы не влияет, а в этой его обновить не смогут, потому что чтобы обновить надо права получить, а эта функция проверяет наличие этого флага. 2. Ну так и сделал, и в триггере на дисконнект его прибиваю. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 13:15 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
YuRockYuRockсделай триггер в каждой такой таблице, который будет делать этот UPDATE OR INSERT флагаУчти, в этом случае обновлять данные в этих таблицах сможет только одна транзакция. Смахивает на монопольное открытие dbf. Монопольное открытие можно и через lock_write сделать, мне это как раз и не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 13:16 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpЗачем в таблицу уникальности?Чтобы дважды не вставить один и тот же ID ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 13:23 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvp2. Ну так и сделал, и в триггере на дисконнект его прибиваюТриггер на дисконнект может штатно не сработать. А вот транзакцию обязательно рано или поздно отпустит, что даст возможность другой транзакции (пере)установить этот флаг (в "таблице уникальности"). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 13:30 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
Использовать генератор для блокировки нежелательных изменений еще никто не предлагал? Взвели генератор - проапдейтили - сняли генератор . Для остальных проверка на триггере и Exception при необходимости. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 14:15 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvphvladпропущено... Вынеси его в другую таблицу с контролем уникальности. Смог добавить флаг - можно работать. Не смог - занято. Чтобы проверять зомби - добавь туда же CONNECTION ID того, кто добавил флаг. Дальше рассказывать ? 1. Зачем в таблицу уникальности? Он же к ID группы привязан, на другие группы не влияет, а в этой его обновить не смогут, потому что чтобы обновить надо права получить, а эта функция проверяет наличие этого флага. 2. Ну так и сделал, и в триггере на дисконнект его прибиваю. Не надо проверять наличие флага. Надо пытаться добавить флаг в табличку с констреинтом уникальности. Индексы живут вне контекста транзакций, поэтому ты гарантированно получишь отлуп при попытке добавить еще один флаг, даже если тебе запись с этим флагом не видна. Заодно решаются "проблемы" с падением приложения: транзакция автоматом откатится, флаг снова можно будет добавлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 14:19 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
Stalk, очень плохое решение ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 14:20 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
Котовасия, ты предлагаешь удерживать тр-цию, вставившую флаг, на всё время "блокировки". Не факт, что это приемлемо. Зависит от времени удержания "блокировки". alekcvp, надеюсь, ты понял, что значение флага == ID той группы записей, которую нужно "блокировать" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 14:23 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
hvladКотовасия, ты предлагаешь удерживать тр-цию, вставившую флаг, на всё время "блокировки". Не факт, что это приемлемо. Зависит от времени удержания "блокировки". ... Ну так у ТС в исходном топике: alekcvp...требуется обновить поле value в таблицах MEMBERS и RECORDS для некоторого id_grp. При этом они должны быть обновлены все разом, в одной транзакции ... - какие тут сомнения? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 14:37 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
hvladКотовасия, ты предлагаешь удерживать тр-цию, вставившую флаг, на всё время "блокировки". Не факт, что это приемлемо. Зависит от времени удержания "блокировки". Вся операция, требующая блокировки, всё равно должна в одной транзакции выполняться, так что почему бы и нет?.. hvladalekcvp, надеюсь, ты понял, что значение флага == ID той группы записей, которую нужно "блокировать" ?Ну это понятно, идея мне нравится. Но заводить для этого отдельную таблицу... FireBird 3 поддерживает временные таблицы (которые в базу не пишутся), доступные одновременно всем подключениям? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 17:26 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpFireBird 3 поддерживает временные таблицы (которые в базу не пишутся), доступные одновременно всем подключениям? нет конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 17:29 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpНу, в идеале, мне хочется чтобы это обновление блокировало только записи связанные с обновляемой группой, позволяя нормально работать со всеми остальными... Пройдет пару лет, система станет мощнее, и потребуется двумя "исполнителями" одновременно пересчитывать и апдейтить записи для двух разных групп. Как бы ты не выбрал, надо заранее учитывать, что блокировок может быть несколько. *возможно* проще всего на какой-нибудь из столбцов повесить CHECK CONTRAINT, что grp_id этой записи отсутствует в таблице блокировок WHERE LOCK_TABLE.ATTACHMENT <> CURRENT_CONNECTION. И триггером On Disconnect ее чистить не забывать. Впрочем, это не убережёт от изменения самого grp_id если такое может случиться ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 18:00 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
Stalk, генератор не масштабируется на одновременное обновления 2 и более групп разными исполнителями ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 18:03 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvp...Но заводить для этого отдельную таблицу... Прикинь, всего лишь создаешь табличку - и все, задача решена... :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 18:04 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpНу это понятно, идея мне нравится. Но заводить для этого отдельную таблицу... Лучше завести ОДНУ лишнюю табличку и для блокировки добавлять ОДНУ строку в неё, чем переписывать ВСЕ строки целевой группы в твоей больше таблицы, даже если из всей группы ты потом только изменишь 1% записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 18:04 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
YuRockТриггер на дисконнект может штатно не сработать. Может, хотя и не часто. А вот триггер на коненкт сработает ;-) Лайфхак из серии "чем общаги девочек отличаются от общаг мальчиков" ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 18:07 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvp Код: plsql 1.
alekcvp Код: plsql 1.
кто есть uid ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 18:09 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpFireBird 3 поддерживает временные таблицы (которые в базу не пишутся), доступные одновременно всем подключениям? а если бы поддерживал? ты не хочешь создавать ещё одну обычную таблицу (со списоком блокировок), но без хочешь создать ещё одну необычную (временную) таблицу? а в чем разница? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 18:11 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpЕсли во время обновления данных произойдёт какой-либо exception, то она вызывается ещё раз с locked = 0, после чего транзакции делается rollback. зачем? Анекдот про два стакана на ночь у постели программиста? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 18:14 |
|
|
start [/forum/topic.php?fid=40&msg=39635427&tid=1561139]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 312ms |
total: | 488ms |
0 / 0 |