Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток всем! PB9, ORACLE 9. Требуется заблокировать выбранные строки таблицы в DW и DS. Вопрос, собственно, в следующем: можно ли в DW и DS использовать SELECT ... FOR UPDATE для блокировки выборки? Я впрямую написал это, но эффекта не получил. Есть ли какие-либо соображения по этому поводу? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 10:32 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
1. как выглядит, что не получил эффекта? 2. приведи SELECT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 10:50 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
1. В РВ создаю DWO SELECT "SWIFT_SOST"."SS_ID", "SWIFT_SOST"."SS_NAME" FROM "SWIFT_SOST" FOR UPDATE и делаю retrieve В PLSQL Developer выполняю SELECT "SWIFT_SOST"."SS_ID", "SWIFT_SOST"."SS_NAME" FROM "SWIFT_SOST" FOR UPDATE который успешно проходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 11:15 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
1. а ты знаешь, что если ты выполняешь подобное без NOWAIT и кто-то уже заблокировал хотя бы одну строку из нужных тебе, то перейдешь в ожидание до освобождения блокировки? 2. не ответил на первый вопрос - как определяешь, что не получил эффекта 3. в некоторых версиях Oracle после UPDATE нужно было указывать имя поля (любого), которое хочешь изменять. М.б. в PB эта фича осталась? 4. кавычки не обязательны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 11:29 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
1. Знаю 2. Select выполняется как в первой (PB) так и во второй (PLSQL Developer) транзакции 3. В PB синтаксис FOR UDATE COLUMN_NAME дает ошибку при сохранении 4. Знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 11:37 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Попробуй посмотреть так 1. в PB выполняешь SELECT FOR UPDATE 2. в PLSQL Developer смотришь v$session и находишь SID сессии с PB 3. в v$lock смотришь, появились ли строки для сессии с PB. Если нет - значит действительно строки не блокируются (FOR UPDATE не выполняется) Встречался с неполной совместимостью PB и Oracle (PB7 и Oracle8), когда запрос, выполнявшийся в SQL Navigator, вызывал ошибку в PB. Обход подобных ситуаций - создать процедуру на сервере, а в PB возвращать курсор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 12:04 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
To tru55. Посмотрел, нет в v$lock такого SID, но, что интересно, если я сначала в PLSQL Developer выполняю этот SELECT ... FOR UPDATE, то в PB он явно подвисает до ROLLBACK, а без FOR UPDATE выполняется сразу! Так, что же делать, господа? Кто что присоветует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 12:53 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
To tru55: пожалуй прислушаюсь к совету по поводу процедуры. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 12:56 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Посмотри, может autocommit установлен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 13:07 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Нет, не установлен, проверил. Я его НИКОГДА не устанавливаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 13:17 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Используем примерно следующий подход (на псевдокоде) 1. execute immediate "select for update " + sql_from_dw + " nowait"; 2. dw.retrieve() 3. commit/rollback; ========== PB7.0.3 + Oracle (последнее время чаще всего 9.2.0.7 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 13:38 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
To PL99. Спасибо за совет. Блокирует нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 13:52 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
To PL99. Только сохраняется опасность того, что между EXECUTE и Retrieve могут появиться и другие записи, удовлетворяющие WHERE, которые не будут заблокированы, но попадут в DW. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 13:59 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
AIZTo PL99. Только сохраняется опасность того, что между EXECUTE и Retrieve могут появиться и другие записи, удовлетворяющие WHERE, которые не будут заблокированы, но попадут в DW.Да, вероятно, в Вашем случае такую ситуацию исключать нельзя. Дело в том, что мы пользуемся подобным подходом для предотвращения одновременного редактирования одной записи (условие выборки всегда содержит первичный ключ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 16:47 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
AIZДоброго времени суток всем! PB9, ORACLE 9. Требуется заблокировать выбранные строки таблицы в DW и DS. Вопрос, собственно, в следующем: можно ли в DW и DS использовать SELECT ... FOR UPDATE для блокировки выборки? Я впрямую написал это, но эффекта не получил. Есть ли какие-либо соображения по этому поводу? Спасибо. Как обычно, придётся спросить, а зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 17:06 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Да, для одной записи, пожалуй, лучше и не придумаешь, но, к сожалению, записей довольно много и они интенсивно плодятся. Буду процедуру использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 17:08 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Филипп AIZДоброго времени суток всем! PB9, ORACLE 9. Требуется заблокировать выбранные строки таблицы в DW и DS. Вопрос, собственно, в следующем: можно ли в DW и DS использовать SELECT ... FOR UPDATE для блокировки выборки? Я впрямую написал это, но эффекта не получил. Есть ли какие-либо соображения по этому поводу? Спасибо. Как обычно, придётся спросить, а зачем? Иногда требуется по бизнес-условиям (например - редактирование одного документа) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 17:08 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
tru55 Филипп AIZSELECT ... FOR UPDATE а зачем? Иногда требуется по бизнес-условиям (например - редактирование одного документа) Т.е. предлагается держать транзакцию открытой в течении всего времени редактирования документа (а в итоге и перекура и обеда, да помножем на кол-во одновременно открытых документов :)? Оракл конечно с этим справляется на ура, но только для небольшого числа юзеров - система получается немасштабируемой (экспоненциальное возрастание требований к ресурсам сервера при линейном возрастании кол-ва пользователей). Для блокировок документов существуют множество других (нетребовательных к ресурсам сервера) способов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 17:54 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky tru55 Филипп AIZSELECT ... FOR UPDATE а зачем? Иногда требуется по бизнес-условиям (например - редактирование одного документа) Т.е. предлагается держать транзакцию открытой в течении всего времени редактирования документа (а в итоге и перекура и обеда, да помножем на кол-во одновременно открытых документов :)? Оракл конечно с этим справляется на ура, но только для небольшого числа юзеров - система получается немасштабируемой (экспоненциальное возрастание требований к ресурсам сервера при линейном возрастании кол-ва пользователей). Для блокировок документов существуют множество других (нетребовательных к ресурсам сервера) способов. 1. это извечный спор между опимистическим и пессимистическим блокированием :) В некоторых случаях хорошо одно, в некоторых другое. Я бы не стал однозначно отрицать ни то, ни другое 2. кол. одновременно открытых на редактирование документов, как правило, не больше кол. работающих пользователей (а в реальности значительно меньше) 3. экспоненциальное возрастание требований к ресурсам сервера Позвольте спросить - к каким ресурсам? И при каком кол. пользователей реально возникнут трудности? 4. Для блокировок документов существуют множество других способов Все известные мне способы не лишены недостатков PS ну и вопрос не совсем для этого топика :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 18:08 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
tru551. это извечный спор между опимистическим и пессимистическим блокированием :) В некоторых случаях хорошо одно, в некоторых другое. Я бы не стал однозначно отрицать ни то, ни другое 2. кол. одновременно открытых на редактирование документов, как правило, не больше кол. работающих пользователей (а в реальности значительно меньше) 3. экспоненциальное возрастание требований к ресурсам сервера Позвольте спросить - к каким ресурсам? И при каком кол. пользователей реально возникнут трудности? 4. Для блокировок документов существуют множество других способов Все известные мне способы не лишены недостатков PS ну и вопрос не совсем для этого топика :) 1 - Нет, я про другое. Почувствуйте разницу: "пессимистическая блокировка документов" - это "что сделать", а "блокирование строк таблицы на время транзакции" - это "как сделать". Ту же пессимистическую блокировку можно и по другому сделать. 2 - Нет такого правила (не больше одного). Зато есть законы Мерфи. Если программа разрешает открыть больше одного, значит пользователь откроет. Надо так строить систему, чтобы любое кол-во открытых документов никак не сказывалось на производительности сервера. 3 - например RAM и UNDO 4 - Да. Я привел недостатки этого способа. PS - Ну так пока автор отвечает Филиппу на вопрос "зачем?", нам есть чем заняться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 20:33 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Эти действия будет выполнять ОДИН процесс приема документов от филиалов банка для того, чтобы глупый главбух центра ничего не мог с ними сотворить, пока они обрабатываются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 09:17 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
18-я весна tru551. это извечный спор между опимистическим и пессимистическим блокированием :) В некоторых случаях хорошо одно, в некоторых другое. Я бы не стал однозначно отрицать ни то, ни другое 2. кол. одновременно открытых на редактирование документов, как правило, не больше кол. работающих пользователей (а в реальности значительно меньше) 3. экспоненциальное возрастание требований к ресурсам сервера Позвольте спросить - к каким ресурсам? И при каком кол. пользователей реально возникнут трудности? 4. Для блокировок документов существуют множество других способов Все известные мне способы не лишены недостатков PS ну и вопрос не совсем для этого топика :) 1 - Нет, я про другое. Почувствуйте разницу: "пессимистическая блокировка документов" - это "что сделать", а "блокирование строк таблицы на время транзакции" - это "как сделать". Ту же пессимистическую блокировку можно и по другому сделать. 2 - Нет такого правила (не больше одного). Зато есть законы Мерфи. Если программа разрешает открыть больше одного, значит пользователь откроет. Надо так строить систему, чтобы любое кол-во открытых документов никак не сказывалось на производительности сервера. 3 - например RAM и UNDO 4 - Да. Я привел недостатки этого способа. PS - Ну так пока автор отвечает Филиппу на вопрос "зачем?", нам есть чем заняться :) 1. сделать по другому - это как? Кроме того, SELECT FOR UPDATE - стандартный способ, которй Oracle предоставляет разработчику и которым пользуется сам. Зачем еще изобретать велосипед? 2. а где было сказано, что программа позволяет открыть больше одного документа? Лично я считаю, что открывать больше 1 на РЕДАКТИРОВАНИЕ (не на просмотр) не имеет смысла - это неестественно для человека 3. RAM - это что? В терминологии Oracle есть понятие SGA. Какие структуры для этого задействованы в данном случае? Если buffer cache, дык блоки все равно туда читаются, вне зависимости от того, просто я смотрю документ или накладываю блокировки на строки. UNDO тратится при изменении данных, а не при SELECT FOR UPDATE 4. по поводу пункта 4 - не понял ответа... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 10:51 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
tru55 1. сделать по другому - это как? Кроме того, SELECT FOR UPDATE - стандартный способ, которй Oracle предоставляет разработчику и которым пользуется сам. Зачем еще изобретать велосипед? 2. а где было сказано, что программа позволяет открыть больше одного документа? Лично я считаю, что открывать больше 1 на РЕДАКТИРОВАНИЕ (не на просмотр) не имеет смысла - это неестественно для человека 3. RAM - это что? В терминологии Oracle есть понятие SGA. Какие структуры для этого задействованы в данном случае? Если buffer cache, дык блоки все равно туда читаются, вне зависимости от того, просто я смотрю документ или накладываю блокировки на строки. UNDO тратится при изменении данных, а не при SELECT FOR UPDATE 4. по поводу пункта 4 - не понял ответа... 1 - а кто сказал что надо изобретать? Взять готовое решение. Их множество и они обсуждались много раз по всему инету и на sql.ru в частности. 2 - это Вы скажите нашим бухгалтерам :) 3 - каждая блокировка документа требует отдельного сеанса, а на них уходит память, а она конечна. Undo - если в ходе редактирования создаются временные данные на сервере. 4 - Еще раз. Все способы имеют недостатки. Но недостаток этого способа - немасштабируемость . При большой нагрузке он играет основную роль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 11:46 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky tru55 1. сделать по другому - это как? Кроме того, SELECT FOR UPDATE - стандартный способ, которй Oracle предоставляет разработчику и которым пользуется сам. Зачем еще изобретать велосипед? 2. а где было сказано, что программа позволяет открыть больше одного документа? Лично я считаю, что открывать больше 1 на РЕДАКТИРОВАНИЕ (не на просмотр) не имеет смысла - это неестественно для человека 3. RAM - это что? В терминологии Oracle есть понятие SGA. Какие структуры для этого задействованы в данном случае? Если buffer cache, дык блоки все равно туда читаются, вне зависимости от того, просто я смотрю документ или накладываю блокировки на строки. UNDO тратится при изменении данных, а не при SELECT FOR UPDATE 4. по поводу пункта 4 - не понял ответа... 1 - а кто сказал что надо изобретать? Взять готовое решение. Их множество и они обсуждались много раз по всему инету и на sql.ru в частности. 2 - это Вы скажите нашим бухгалтерам :) 3 - каждая блокировка документа требует отдельного сеанса, а на них уходит память, а она конечна. Undo - если в ходе редактирования создаются временные данные на сервере. 4 - Еще раз. Все способы имеют недостатки. Но недостаток этого способа - немасштабируемость . При большой нагрузке он играет основную роль. 1. Готовое решение - это как раз SELECT FOR UPDATE. Другие - как-то не очень знаю Если, например, изменять какой-либо флаг в колонке таблице - это еще более требовательно к ресурсам (UNDO, REDO и т.д) 2. не знаю ваших бухгалтеров У меня таких прецендентов не было 3. каждая блокировка документа требует отдельного сеанса Ет-т-то еще с какого перепуга? Undo - если в ходе редактирования создаются временные данные на сервере - ни о каких временных данных речь не шла - только о SELECT FOR UPDATE - что вообще подразумевается под временными данными? Это понятие можно трактовать очень широко 4. вот насчет немасштабируемости у меня большие сомнения. Кроме того, я уже задавал вопрос - при каком кол. одновременно работающих пользователей это может сказаться? Несколько десятков, сотен, тысяч? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 12:00 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
tru553. каждая блокировка документа требует отдельного сеанса Ет-т-то еще с какого перепуга? Если рассмотреть два клиента, то каждому из них сохранения блокировки требуется сохранять сеанс. 4. вот насчет немасштабируемости у меня большие сомнения. Кроме того, я уже задавал вопрос - при каком кол. одновременно работающих пользователей это может сказаться? Несколько десятков, сотен, тысяч? Поделите память сервера на память одного сеанса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 12:18 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky tru553. каждая блокировка документа требует отдельного сеанса Ет-т-то еще с какого перепуга? Если рассмотреть два клиента, то каждому из них сохранения блокировки требуется сохранять сеанс. 4. вот насчет немасштабируемости у меня большие сомнения. Кроме того, я уже задавал вопрос - при каком кол. одновременно работающих пользователей это может сказаться? Несколько десятков, сотен, тысяч? Поделите память сервера на память одного сеанса. 1. сеанс (или сессия) создается при подключении клиента к серверу. Никаких дополнительных сеансов затем НЕ создается, в независимости от того, идет ли просто просмотр данных, их изменение или блокировка данных (опять же, несущественно, с пом. SELECT FOR UPDATE, с пом. обычного DML или с пом. LOCK TABLE IN EXCLUSIVE MODE) 2. Хм-м-м. Доволно оригинальный метод подсчета памяти. По моим сведениям есть SGA, размер которой практически не зависит от кол. сеансов (за маленьким исключением) и PGA, которая выделяется сеансу, но она никаким боком не связана с блокировкой. Кроме того, на современных серверах обычно стоит несколько Гигов памяти, поэтому ее не так просто всю исчерпать (а работа одновременно нескольких тысяч пользователей тоже нечасто встречается) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 12:28 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
tru551) Никаких дополнительных сеансов затем НЕ создается .... 2) PGA, которая выделяется сеансу ... 3) на современных серверах обычно стоит несколько Гигов памяти 1 - А я и не говорил этого. Я говорил что каждуму клиенту нужен отдельный сеанс на все время работы с документом. Если блокировка строк не используется , то после открытия документа можно отключить сеанс. 2 - В зависимости от того что делает сеанс, PGA сеанса может достигать нескольких Мб, особенно при использовании PL/SQL 3 - При плохой архитектуре нельзя увеличить производительность просто нарастив память. Если же говорить о малом кол-ве пользователей, то всплывают другие недостатки, основной из которых то, что блокировку может снять только тот сеанс, что и блокировал, или админ, а в реальной жизни бывают разные ситуации. PS. Заканчиваем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 12:57 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky tru551) Никаких дополнительных сеансов затем НЕ создается .... 2) PGA, которая выделяется сеансу ... 3) на современных серверах обычно стоит несколько Гигов памяти 1 - А я и не говорил этого. Я говорил что каждуму клиенту нужен отдельный сеанс на все время работы с документом. Если блокировка строк не используется , то после открытия документа можно отключить сеанс. 2 - В зависимости от того что делает сеанс, PGA сеанса может достигать нескольких Мб, особенно при использовании PL/SQL 3 - При плохой архитектуре нельзя увеличить производительность просто нарастив память. Если же говорить о малом кол-ве пользователей, то всплывают другие недостатки, основной из которых то, что блокировку может снять только тот сеанс, что и блокировал, или админ, а в реальной жизни бывают разные ситуации. PS. Заканчиваем. 1. а зачем обрывать сеанс при работе с документом? Особенно стремно будет, если пока этот пользователь будет рассматривать (а не дай бог редактировать) документ в offline, кто-то другой его изменит (а не дай бог, удалит). Да и частые logon/logoff не есть хорошо для производительности сервера 2. может, только какое это имеет отношение к SELECT FOR UPDATE ? Как я уже сказал, блокировки НЕ используют PGA 3. это тоже хорошая фраза, только непонятно, какое она имеет отношение к блокировкам 4. блокировку может снять только тот сеанс, что и блокировал, или админ Это так, но - это же относится к любым другим блокировкам, не только SELECT FOR UPDATE - как я уже сказал, если по бизнес-условиям другие пользователи могут только просматривать документ, не имея возможности его редактировать, то это вполне нормально. Более того, любые другие доморощенные способы типа установки флагов НЕ МОГУТ обеспечить соблюдение подобных бизнес-условий, особенно, если с данными работает не только это приложение. При написании другого приложения эти флаги могут не проверяться, не говоря уж о работе через SQL*Plus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 13:14 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
tru554. блокировку может снять только тот сеанс, что и блокировал, или админ Это так, но - это же относится к любым другим блокировкам, не только SELECT FOR UPDATE - как я уже сказал, если по бизнес-условиям другие пользователи могут только просматривать документ, не имея возможности его редактировать, то это вполне нормально. Более того, любые другие доморощенные способы типа установки флагов НЕ МОГУТ обеспечить соблюдение подобных бизнес-условий, особенно, если с данными работает не только это приложение. При написании другого приложения эти флаги могут не проверяться, не говоря уж о работе через SQL*Plus Не надо обобщать. Это НЕ относится к любым другим блокировкам документов. Если Вы не знаете как это сделать без блокировки записей, то это не значит что это нельзя сделать вообще. Почитайте например здесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 14:10 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky tru554. блокировку может снять только тот сеанс, что и блокировал, или админ Это так, но - это же относится к любым другим блокировкам, не только SELECT FOR UPDATE - как я уже сказал, если по бизнес-условиям другие пользователи могут только просматривать документ, не имея возможности его редактировать, то это вполне нормально. Более того, любые другие доморощенные способы типа установки флагов НЕ МОГУТ обеспечить соблюдение подобных бизнес-условий, особенно, если с данными работает не только это приложение. При написании другого приложения эти флаги могут не проверяться, не говоря уж о работе через SQL*Plus Не надо обобщать. Это НЕ относится к любым другим блокировкам документов. Если Вы не знаете как это сделать без блокировки записей, то это не значит что это нельзя сделать вообще. Почитайте например здесь 1. я имел ввиду блокировки, накладываемые операциями DML. Пока транзакция не завершена (а они бывают длинными - что поделаешь), никто эти блокировки снять не может 2. почитал. Как я и сказал - зачем изобретать велосипед, если есть решение от Oracle? Конкретно по предлагаемому решению с доп. таблицей... - генерится лишние UNDO и REDO, что при большом кол. пользователей и документов не есть гуд. - работа с доп. таблицей потребляет и другие ресурсы - buffer cache и лишняя работа DBRW и LGRW как минимум - подобная дисциплина работы должна соблюдаться всеми приложениями, работающими с этими документами, иначе это не имеет смысла. Кроме того, есть еще упомянутый мной SQL*Plus (и другие подобные инструментальные средства), которые эту дисциплину ну никак не соблюдают Я не отрицаю, что подобные методы в некоторых случаях имеют право на жизнь (в том топике обсуждались условия, что при некоторых обстоятельствах другой пользователь может изменять документ, который редактируется первым пользователем), но при тех условиях, которые упоминал я (документ может одновременно редактироваться только одним пользователем, другие - только смотреть), SELECT FOR UPDATE - наилучший вариант из всех возможных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 14:32 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
tru551. я имел ввиду блокировки, накладываемые операциями DML. Пока транзакция не завершена (а они бывают длинными - что поделаешь), никто эти блокировки снять не может Вы ж сами подняли тему оптимистических/пессимистических блокировок. А это на уровень выше чем блокировка уровня строк. 2. почитал. Как я и сказал - зачем изобретать велосипед, если есть решение от Oracle? Это частное решение частной задачи - как заблокировать операцию изменения документа. А над документом могут применяться и другие прикладные операции, изменяющие его состояние. Конкретно по предлагаемому решению с доп. таблицей... - генерится лишние UNDO и REDO, что при большом кол. пользователей и документов не есть гуд. - работа с доп. таблицей потребляет и другие ресурсы - buffer cache и лишняя работа DBRW и LGRW как минимум Это все по-любому будет при редактировании документа. Причем в сравнении с UNDO|REDO генерируемыми непосредственно изменением документа, эти служебные операции занимают пренебрежимо мало ресурсов, да еще и не зависят от объема документа. - подобная дисциплина работы должна соблюдаться всеми приложениями, работающими с этими документами, иначе это не имеет смысла. Кроме того, есть еще упомянутый мной SQL*Plus (и другие подобные инструментальные средства), которые эту дисциплину ну никак не соблюдают Для этого есть триггеры. Я не отрицаю, что подобные методы в некоторых случаях имеют право на жизнь (в том топике обсуждались условия, что при некоторых обстоятельствах другой пользователь может изменять документ, который редактируется первым пользователем), но при тех условиях, которые упоминал я (документ может одновременно редактироваться только одним пользователем, другие - только смотреть), SELECT FOR UPDATE - наилучший вариант из всех возможных SELECT FOR UPDATE - решает только одну частную задачу, Вашу. И в ситуации, где разработчик может навязать пользователю свое решение и свести задачу к этой частной, оно применимо. Но жизнь вносит коррективы. И в условиях когда заказчиков десятки и сотни, и каждому требуется что-то свое, простые стандартные решения, как это, не гибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 15:04 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
1. Вы ж сами подняли тему оптимистических/пессимистических блокировок. А это на уровень выше чем блокировка уровня строк. Вообще-то SELECT FOR UPDATE - это блокировка именно уровня строк (неважно, что их м.б. несколько). И если я сделаю UPDATE, который затронет 100 строк - никакой разницы не будет 2. Это частное решение частной задачи - как заблокировать операцию изменения документа. А над документом могут применяться и другие прикладные операции, изменяющие его состояние. Во-первых те условия, которые я назвал, достаточно часто встречаются. Во-вторых, я уже сказал, что я не отрицаю для других условий другие способы. Я просто говорил о разнообразии приемов и о том, что SELECT FOR UPDATE вполне заслуживает право на жизнь 3. Это все по-любому будет при редактировании документа. Причем в сравнении с UNDO|REDO генерируемыми непосредственно изменением документа, эти служебные операции занимают пренебрежимо мало ресурсов, да еще и не зависят от объема документа. Да, эти служебные операции занимают немного, но зачем их городить, если без них можно обойтись? Я уж не говорю, что еще придется городить огород для разрешения случаев, когда сессия, поставившая таким образом блокировку, неожиданно отвалится. Это также подмена стандартных механизмов Oracle, и этим стоит заниматься только тогда, когда без этого никак не обойтись 4. Для этого есть триггера. Да конечно, но это еще дополнительная нагрузка на сервер (а мы начинали разговор с излишнего потребления ресурсов, насколько мне помнится). Я уж не говорю о возможности отключения триггера (случайного или преднамеренного) 5. Но жизнь вносит коррективы. И в условиях когда заказчиков десятки и сотни, и каждому требуется что-то свое, простые стандартные решения, как это, не гибки. Я уже говорил о том, что не считаю SELECT FOR UPDATE чем-то универсальным. Однако свою область применения он имеет. А если речь идет о том, чтобы делать некое универсальное решение даже в ущерб производительности - это спорный подход. Тем паче, что да-а-алеко не все программы делаются для тиражирования. Есть масса фирм, которые держат программистов для собственных нужд, соответственно, каждая прога - в одном экземпляре (лично я достаточно много поработал в подобных местах) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 15:33 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
tru55SELECT FOR UPDATE вполне заслуживает право на жизнь Это немного другая формулировка чем tru55SELECT FOR UPDATE - наилучший вариант из всех возможных Неправда ли? tru554. Для этого есть триггера. Да конечно, но это еще дополнительная нагрузка на сервер (а мы начинали разговор с излишнего потребления ресурсов, насколько мне помнится). Я уж не говорю о возможности отключения триггера (случайного или преднамеренного) Как Вы думаете что больше займет ресурсов, вставка одной записи в таблицу блокировок или выборка всех строк документа для блокирования? А насчет отключения триггера - если у пользователя есть права на изменение схемы, то защиты от него нет никакой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 16:24 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky tru55SELECT FOR UPDATE вполне заслуживает право на жизнь Это немного другая формулировка чем tru55SELECT FOR UPDATE - наилучший вариант из всех возможных Неправда ли? tru554. Для этого есть триггера. Да конечно, но это еще дополнительная нагрузка на сервер (а мы начинали разговор с излишнего потребления ресурсов, насколько мне помнится). Я уж не говорю о возможности отключения триггера (случайного или преднамеренного) Как Вы думаете что больше займет ресурсов, вставка одной записи в таблицу блокировок или выборка всех строк документа для блокирования? А насчет отключения триггера - если у пользователя есть права на изменение схемы, то защиты от него нет никакой. 1. не надо выдергивать из контекста. Про наилучший вариант я говорил именно для описанных мной бизнес-условий 2. Как Вы думаете что больше займет ресурсов, вставка одной записи в таблицу блокировок или выборка всех строк документа для блокирования? Если я читаю строки документа, то они и так будут выбраны в buffer cache, независимо от того, делаю я обычный SELECT или SELECT FOR UPDATE 3. насчет отключения триггера я, естественно, несколько перебрал (хотя для этого достаточно привилегий не на все, а только на ALTER TRIGGER), но справедливости ради отмечу, что SELECT FOR UPDATE защитит строки от редактирования даже и в этом случае (если кто-то захочет "изменить схему") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 16:42 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
tru551. не надо выдергивать из контекста. Про наилучший вариант я говорил именно для описанных мной бизнес-условий А я не выдергиваю. Он НЕ лучший даже для описанных Вами бизнес-условий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 16:57 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky tru551. не надо выдергивать из контекста. Про наилучший вариант я говорил именно для описанных мной бизнес-условий А я не выдергиваю. Он НЕ лучший даже для описанных Вами бизнес-условий. А вот в этом Вы меня НЕ убедили. Пока что я увидел только лишнее потребление ресурсов в Вашем случае + написание лишнего кода PS М-м-м.. Впрочем, про изобретение велосипеда я уже говорил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 17:14 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
tru55А вот в этом Вы меня НЕ убедили :-) С чего вдруг я должен что-либо доказывать? Не я утверждал, что мое решение лучшее - не мне доказывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 17:24 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Сдается мне, что select for update есть единственный способ заблокировать данные от изменений, предлагаемый самим Ораклом. Очень, кстати, забавные примеры есть у Т.Кайта о том, как люди пытаются быть умнее, чем Оракл, придумывая и реализуя свои собственные механизмы блокировок, ограничения доступа и прочая, и прочая. Правда, таких людей Т.Кайт оправдывает тем, что те перешли с других СУБД и не смогли(не успели) подробно ознакомиться с архитектурой и функциональными возможностями новой для них системы. Основной вывод, который он делает - ребята, прежде, чем изобретать что-то своё, попробуйте найти и применить стандартное оракловское решение, ведь почти всё, о чём вы мечтали, уже реализовано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 17:30 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky tru55А вот в этом Вы меня НЕ убедили :-) С чего вдруг я должен что-либо доказывать? Не я утверждал, что мое решение лучшее - не мне доказывать. Хех... Я и не говорил, что SELECT FOR UPDATE - лучшее всегда, я лишь говорил, что оно хорошо при определенных обстоятельствах. Это кто-то другой стал говорить о повышенном расходе ресурсов в случае SELECT FOR UPDATE, никак это не аргументируя... PS на всякий случай - цитаты моих высказываний с начала Иногда требуется по бизнес-условиям (например - редактирование одного документа) В некоторых случаях хорошо одно, в некоторых другое. Я бы не стал однозначно отрицать ни то, ни другое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 17:35 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
AIZДоброго времени суток всем! PB9, ORACLE 9. Требуется заблокировать выбранные строки таблицы в DW и DS. Вопрос, собственно, в следующем: можно ли в DW и DS использовать SELECT ... FOR UPDATE для блокировки выборки? Я впрямую написал это, но эффекта не получил. Есть ли какие-либо соображения по этому поводу? Спасибо. Можно пойти таким путём: 1) В retrieveend DW/DS IF rowcount > 0 создаешь и подсоединяешь transaction object (instance variable) (в retrievestart if it's valid - disconnect using it) 2) embedded sql такой же как SELECT DW/DS + FOR UPDATE clause, исполняешь его, если спец transaction object не показывает ошибок, значит выбранные строки таблицы заблокированы 3) в Save process пишешь типа: ROLLBACK using спец transaction object, если не показывает ошибок то DW/DS.Update() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2007, 18:40 |
|
||
|
DW, DS и SELECT ... FOR UPDATE
|
|||
|---|---|---|---|
|
#18+
Чуть-чуть вмешаюсь. Подход, используемый tru55, прекрасно работает. И никаких проблем не возникает. Всегда надо в первую очередь использовать стандартные средства блокирования записей. Если по каким-либо причинам их недостаточно, можно разарабатывать свои. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2007, 19:33 |
|
||
|
|

start [/forum/topic.php?all=1&fid=15&tid=1337254]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 405ms |

| 0 / 0 |
