Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
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?fid=15&msg=34424264&tid=1337254]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 378ms |

| 0 / 0 |
