powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Массовое обновление данных в базе
25 сообщений из 74, страница 2 из 3
Массовое обновление данных в базе
    #39635292
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpА если он создаётся внутри обновляющей транзакции, то другие пользователи его всё равно не увидят до тех пор пока транзакция не завершится - он бесполезен.Как раз увидят, если попытаются создать такую же запись. Или обновить существующую. UPDATE OR INSERT, например, упадет.
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635293
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockalekcvpА если он создаётся внутри обновляющей транзакции, то другие пользователи его всё равно не увидят до тех пор пока транзакция не завершится - он бесполезен.Как раз увидят, если попытаются создать такую же запись. Или обновить существующую. UPDATE OR INSERT, например, упадет.
Ага, только мне нужно чтобы они и в другие таблицы не могли добавлять записи, ссылающиеся на эту.
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635295
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpАга, только мне нужно чтобы они и в другие таблицы не могли добавлять записи, ссылающиеся на эту.Ну правильно!
Вначале добавляешь такой флаг, если получилось - делаешь все дальнейшие обновления по таблицам, если не получилось - полный отлуп.
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635297
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpмне нужно чтобы они и в другие таблицы не могли добавлять записи, ссылающиеся на этуА, я понял. Ну сделай триггер в каждой такой таблице, который будет делать этот UPDATE OR INSERT флага.
Ужас какой-то, конечно :)
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635299
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockсделай триггер в каждой такой таблице, который будет делать этот UPDATE OR INSERT флагаУчти, в этом случае обновлять данные в этих таблицах сможет только одна транзакция. Смахивает на монопольное открытие dbf.
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635306
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp1. Добавил в таблице групп поле grplock;Вынеси его в другую таблицу с контролем уникальности.
Смог добавить флаг - можно работать.
Не смог - занято.
Чтобы проверять зомби - добавь туда же CONNECTION ID того, кто добавил флаг.
Дальше рассказывать ?
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635320
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladalekcvp1. Добавил в таблице групп поле grplock;Вынеси его в другую таблицу с контролем уникальности.
Смог добавить флаг - можно работать.
Не смог - занято.
Чтобы проверять зомби - добавь туда же CONNECTION ID того, кто добавил флаг.
Дальше рассказывать ?
1. Зачем в таблицу уникальности? Он же к ID группы привязан, на другие группы не влияет, а в этой его обновить не смогут, потому что чтобы обновить надо права получить, а эта функция проверяет наличие этого флага.
2. Ну так и сделал, и в триггере на дисконнект его прибиваю.
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635322
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockYuRockсделай триггер в каждой такой таблице, который будет делать этот UPDATE OR INSERT флагаУчти, в этом случае обновлять данные в этих таблицах сможет только одна транзакция. Смахивает на монопольное открытие dbf.
Монопольное открытие можно и через lock_write сделать, мне это как раз и не нужно.
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635327
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЗачем в таблицу уникальности?Чтобы дважды не вставить один и тот же ID
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635345
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp2. Ну так и сделал, и в триггере на дисконнект его прибиваюТриггер на дисконнект может штатно не сработать.
А вот транзакцию обязательно рано или поздно отпустит, что даст возможность другой транзакции (пере)установить этот флаг (в "таблице уникальности").
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635423
Stalk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать генератор для блокировки нежелательных изменений еще никто не предлагал?

Взвели генератор - проапдейтили - сняли генератор .
Для остальных проверка на триггере и Exception при необходимости.
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635427
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvphvladпропущено...
Вынеси его в другую таблицу с контролем уникальности.
Смог добавить флаг - можно работать.
Не смог - занято.
Чтобы проверять зомби - добавь туда же CONNECTION ID того, кто добавил флаг.
Дальше рассказывать ?
1. Зачем в таблицу уникальности? Он же к ID группы привязан, на другие группы не влияет, а в этой его обновить не смогут, потому что чтобы обновить надо права получить, а эта функция проверяет наличие этого флага.
2. Ну так и сделал, и в триггере на дисконнект его прибиваю.
Не надо проверять наличие флага.
Надо пытаться добавить флаг в табличку с констреинтом уникальности. Индексы живут вне контекста транзакций, поэтому ты гарантированно получишь отлуп при попытке добавить еще один флаг, даже если тебе запись с этим флагом не видна.
Заодно решаются "проблемы" с падением приложения: транзакция автоматом откатится, флаг снова можно будет добавлять.
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635428
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stalk,

очень плохое решение
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635431
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия,

ты предлагаешь удерживать тр-цию, вставившую флаг, на всё время "блокировки".
Не факт, что это приемлемо. Зависит от времени удержания "блокировки".


alekcvp,

надеюсь, ты понял, что значение флага == ID той группы записей, которую нужно "блокировать" ?
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635442
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladКотовасия,

ты предлагаешь удерживать тр-цию, вставившую флаг, на всё время "блокировки".
Не факт, что это приемлемо. Зависит от времени удержания "блокировки".
...
Ну так у ТС в исходном топике:
alekcvp...требуется обновить поле value в таблицах MEMBERS и RECORDS для некоторого id_grp. При этом они должны быть обновлены все разом, в одной транзакции ...

- какие тут сомнения?
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635545
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladКотовасия,
ты предлагаешь удерживать тр-цию, вставившую флаг, на всё время "блокировки".
Не факт, что это приемлемо. Зависит от времени удержания "блокировки".
Вся операция, требующая блокировки, всё равно должна в одной транзакции выполняться, так что почему бы и нет?..

hvladalekcvp,
надеюсь, ты понял, что значение флага == ID той группы записей, которую нужно "блокировать" ?Ну это понятно, идея мне нравится. Но заводить для этого отдельную таблицу...
FireBird 3 поддерживает временные таблицы (которые в базу не пишутся), доступные одновременно всем подключениям?
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635547
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpFireBird 3 поддерживает временные таблицы (которые в базу не пишутся), доступные одновременно всем подключениям?

нет конечно
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635574
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНу, в идеале, мне хочется чтобы это обновление блокировало только записи связанные с обновляемой группой, позволяя нормально работать со всеми остальными...

Пройдет пару лет, система станет мощнее, и потребуется двумя "исполнителями" одновременно пересчитывать и апдейтить записи для двух разных групп.

Как бы ты не выбрал, надо заранее учитывать, что блокировок может быть несколько.

*возможно* проще всего на какой-нибудь из столбцов повесить CHECK CONTRAINT, что grp_id этой записи отсутствует в таблице блокировок WHERE LOCK_TABLE.ATTACHMENT <> CURRENT_CONNECTION. И триггером On Disconnect ее чистить не забывать.

Впрочем, это не убережёт от изменения самого grp_id если такое может случиться
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635577
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stalk,

генератор не масштабируется на одновременное обновления 2 и более групп разными исполнителями
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635579
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp...Но заводить для этого отдельную таблицу...
Прикинь, всего лишь создаешь табличку - и все, задача решена... :)
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635580
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНу это понятно, идея мне нравится. Но заводить для этого отдельную таблицу...

Лучше завести ОДНУ лишнюю табличку и для блокировки добавлять ОДНУ строку в неё, чем переписывать ВСЕ строки целевой группы в твоей больше таблицы, даже если из всей группы ты потом только изменишь 1% записей.
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635583
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockТриггер на дисконнект может штатно не сработать.

Может, хотя и не часто.
А вот триггер на коненкт сработает ;-)

Лайфхак из серии "чем общаги девочек отличаются от общаг мальчиков"
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635584
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Код: plsql
1.
      set grplock = case :locked when 1 then :uid else null end


alekcvp
Код: plsql
1.
  if (uid is not null) then



кто есть uid ?
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635585
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpFireBird 3 поддерживает временные таблицы (которые в базу не пишутся), доступные одновременно всем подключениям?

а если бы поддерживал?

ты не хочешь создавать ещё одну обычную таблицу (со списоком блокировок), но без хочешь создать ещё одну необычную (временную) таблицу?

а в чем разница?
...
Рейтинг: 0 / 0
Массовое обновление данных в базе
    #39635588
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЕсли во время обновления данных произойдёт какой-либо exception, то она вызывается ещё раз с locked = 0, после чего транзакции делается rollback.



зачем?

Анекдот про два стакана на ночь у постели программиста?
...
Рейтинг: 0 / 0
25 сообщений из 74, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Массовое обновление данных в базе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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