|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
И снова здравствуйте. Имеется три таблицы: Код: plaintext 1. 2. 3. 4.
В один прекрасный момент требуется обновить поле value в таблицах MEMBERS и RECORDS для некоторого id_grp. При этом они должны быть обновлены все разом, в одной транзакции. Само обновление выглядит так: считывается текущее значение, обрабатывается, на его место записывается новое, кроме того эти поля в этих таблицах зависимы друг от друга. В силу непреодолимых технических причин процесс обновления может занимать до нескольких [десятков] минут и по его завершению не обновлённые записи становятся невалидными. Соответственно, если в этот момент какой-то пользователь изменит запись или добавит новую в таблицу RECORDS с этим же id_grp (читать можно), то процесс придётся начинать сначала. Вопрос: как правильно реализовать такое обновление? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:09 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpВопрос: как правильно реализовать такое обновление? Как вариант, можно сначала обновить "без обновления" (UPDATE RECORDS SET id_grp=id_grp WHERE...). И если это удалось - то отлуп получат уже другие транзакции, пытающиеся изменить эти записи. А эта при реальном обновлении по этой причине уже не отпадет. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:14 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvp, select for update испробован? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:14 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpВопрос: как правильно реализовать такое обновление? Транзакция уровня consistency. Возможно, даже с table preserve или явной блокировкой таблицы от записи. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:16 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
pastoralekcvp, select for update испробован? Нет ещё, я вот и интересуюсь в каком направлении копать. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:26 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovТранзакция уровня consistency Да это понятно. Это не убережет еще не измененные записи от изменения в других транзакциях. pastorselect for update испробован? Да, это вроде как раз для этого и придумано. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:27 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
YuRockalekcvpВопрос: как правильно реализовать такое обновление? И если это удалось - то отлуп получат уже другие транзакции, пытающиеся изменить эти записи. Это не помешает добавлению новых записей, как я понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:27 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
23.04.2018 17:14, pastor пишет: > select for update испробован? глупость Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:27 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpЭто не помешает добавлению новых записей, как я понимаю? Нет, конечно не помешают. Но если должно помешать - то ни update, ни select for update не помогут. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:28 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
YuRockalekcvpЭто не помешает добавлению новых записей, как я понимаю? Нет, конечно не помешают. Но если должно помешать - то ни update, ни select for update не помогут. Ну в данный момент у меня тупо блокируются все три таблицы на изменение, но мне почему-то кажется что это неверный подход... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:29 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
23.04.2018 17:29, alekcvp пишет: > мне почему-то кажется что это неверный подход... не парься. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:31 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
Отозвать грант на запись у простых смертных? Навесить триггеры и проверять комбинацию спец юзера и некоего флага в некой табличке? Было бы желание. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:32 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
А запрос вида: update table set id = id where ... вызывает реально какие-нибудь изменения в базе или нет? Ещё есть идея поставить в records триггер на добавление записей типа: select id from groups where id = new.id_grp with lock; и тогда добавление будет обламываться, если запись в groups уже заблокирована кем-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:33 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpНу в данный момент у меня тупо блокируются все три таблицы на изменение, но мне почему-то кажется что это неверный подход... И как же тогда возможно alekcvpесли в этот момент какой-то пользователь изменит запись или добавит новую в таблицу RECORDS ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:34 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpА запрос вида: update table set id = id where ... вызывает реально какие-нибудь изменения в базе или нет?смотря что подразумевается под "..." ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:34 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
23.04.2018 17:33, alekcvp пишет: > Ещё есть идея способов достичь нирваны через анус превеликое множество. но нужно ли тебе это, при нормальной ориентации? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:34 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpА запрос вида: update table set id = id where ... вызывает реально какие-нибудь изменения в базе или нет? Да. Добавляется версия записи. Как и при вызове SELECT FOR UPDATE WITH LOCK. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:36 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
Мимопроходящий23.04.2018 17:33, alekcvp пишет: > Ещё есть идея способов достичь нирваны через анус превеликое множество. но нужно ли тебе это, при нормальной ориентации? Ну, в идеале, мне хочется чтобы это обновление блокировало только записи связанные с обновляемой группой, позволяя нормально работать со всеми остальными... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:36 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
23.04.2018 17:36, alekcvp пишет: > Ну, в идеале, мне хочется чтобы это обновление блокировало только записи связанные с обновляемой группой, позволяя нормально работать со всеми остальными... это не защитит тебя от Insert-а. а триггер, мало того что он "транзакционно-зависим", только добавит времени выполнения. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:40 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpв идеале, мне хочется чтобы это обновление блокировало только записи связанные с обновляемой группой, позволяя нормально работать со всеми остальными... Если "группа" определяется значением FK ключа, то перед работой с ней обнови master-запись. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 17:46 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvp, Мало выходных данных: акт вандализма разовый или периодически планируется? Влиять на "вне субдшную" логику/алгоритмы есть возможность? Падение производительности на время обновления критично? Если Да, то логично для группы ввести флаг активен/нет. Анализировать его на клиенте (?вьюхах/процедурах). Тогда задача обновления не будет столь критичной. Если нет, запрет реализуется через триггер: если на запись (группу?) выставлен флаг - запрет обновления, вставки данных. Основная цель: избежать длительной и большой транзакции. Цена: производительность ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2018, 22:12 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
Mikle83alekcvp, Мало выходных данных: акт вандализма разовый или периодически планируется? Влиять на "вне субдшную" логику/алгоритмы есть возможность? Падение производительности на время обновления критично? Если Да, то логично для группы ввести флаг активен/нет. Анализировать его на клиенте (?вьюхах/процедурах). Тогда задача обновления не будет столь критичной. Если нет, запрет реализуется через триггер: если на запись (группу?) выставлен флаг - запрет обновления, вставки данных. Основная цель: избежать длительной и большой транзакции. Цена: производительность 1. Разовый, но неоднократный, в смысле изредка возникает необходимость. 2. Есть, но не хотелось бы плодить сущности в виде дополнительных таблиц. К тому же это "псевдотрёхзвенка", т.е. приложение взаимодействует только с ХП. 3. Производительность вообще не критична, желательно чтобы во время обновления можно было получить доступ к незатронутым обновлением записям. Флаг - это хорошо, но если во время обновления приложение будет убито по какой-либо причине? Флаг в базе так и останется, группа станет недоступна и придётся лезть в базу "руками". ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 09:44 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpФлаг - это хорошо, но если во время обновления приложение будет убито по какой-либо причине? Флаг в базе так и останется Флаг - это запись. Если ее удалось удалить обновить - значит, это "зависший" флаг (создввшая его транзакция его не удалила). И как такое может быть, чтобы не было коммита, а флаг остался. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 11:13 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
alekcvpФлаг - это хорошо, но если во время обновления приложение будет убито по какой-либо причине? Флаг в базе так и останется, группа станет недоступна и придётся лезть в базу "руками".В соседней теме Триггер на дисконнект. когда должен сработать? перетирали триггер на дисконнект, как раз для похожего случая. убиение приложения и сетевые обрывы закрывает вполне себе. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 12:30 |
|
Массовое обновление данных в базе
|
|||
---|---|---|---|
#18+
YuRockalekcvpФлаг - это хорошо, но если во время обновления приложение будет убито по какой-либо причине? Флаг в базе так и останется Флаг - это запись. Если ее удалось удалить обновить - значит, это "зависший" флаг (создввшая его транзакция его не удалила). И как такое может быть, чтобы не было коммита, а флаг остался. А если он создаётся внутри обновляющей транзакции, то другие пользователи его всё равно не увидят до тех пор пока транзакция не завершится - он бесполезен. Поэтому его надо создавать вне основной рабочей транзакции, потом делать commit и только потом начинать обновление данных. В итоге сделал следующее: 1. Добавил в таблице групп поле grplock; 2. Когда пользователь запрашивает права на запись в эту группу, то это поле проверяется и если оно не null то он посылается; 3. Добавил ХП LOCK_GROUP(gid, locked), которая делает нехорошую вещь: Код: plsql 1. 2. 3. 4.
т.е. даже внутри транзакции она обновляет это поле и изменения видны всем. Если во время обновления данных произойдёт какой-либо exception, то она вызывается ещё раз с locked = 0, после чего транзакции делается rollback. 4. В дисконнект триггер добавил Код: plsql 1. 2.
P.S: Пишущая транзакция nowait. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2018, 12:48 |
|
|
start [/forum/topic.php?fid=40&fpage=34&tid=1561139]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 152ms |
0 / 0 |