|
|
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
Помогите, не смог найти никгде ответа...Я раньше работал с Интербейс и только начинаю с Ораклом. какой уровень изоляции и тип транзакции надо установить, чтобы если пользователь открыл данные с ключом for update, другие делая выборку не могли выбрать эти данные даже на чтение...Или такое нельзя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 11:58 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
Begemot, v Oracle takoje dazhe i njenuzhno! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 12:06 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
а такая ситуация ....нужно обрабатывать заметки в базе..работает несколько человек...как предусмотреть ситуация, когда с одно статьей будут работать несколько человек?ведь это трата рабочего времени ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 12:21 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
Есть недокументированная фича: select .. for update skip locked. Она _недокументирована_ , со всеми вытекающими. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 12:24 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
В оракуле нельзя запретить чтение заблокированных кем-то данных (если, разумеется, у читателя есть права на чтение). А решение проблемы очень простое - если один юзер начинает изменение, то клиентское приложение посылает select ... for update nowait и проверяет ошибку. Есть - кто-то уже работает с записью - надо сказать юзеру, чтобы подождал освобождения записи и обязательно перезапросил ее, чтобы увидеть новые данные. Нет - все нормально - блокировка прошла и можно править. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 12:27 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
Запретить чтение нельзя - писатели читателей не блокируют (имхо :)). Надо всех обязать использовать select for update для операций изменения данных. Если этот код локализован - нет проблем, иначе - большие проблемы, если одновременное редактирование это нормальное дело в вашей ситуации. Кстати, вопрос - если запись редактируется долго и содерит ссылки на другие таблицы/на нее ссылаются - это как-то может заблокировать еще и их? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 13:46 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
K statji - jeslji pomenjatj vsje "select" na "select for update", mozhno ozhidatj davoljno bolshoj prirost redo informaciiji i posljedovatejno snjizhenjije proizvaditeljnostji. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 13:58 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
Посмотри доки, например здесь http://www.csee.umbc.edu/help/oracle8/server.815/a67775/ch9_tran.htm Есть (как минимум) 3 варианта -- все селекты делаются FOR UPDATE (пессимистик лок). Не рекомендуется при частых запросах, особено если кто из "писателей" любит пить кофе по 2 часа бросив комп с открытым документом. -- трансактион левел - СЕРИАЛИЗАБЛЕ (оптимистик лок). Вполне удачный вариант во многих сутиаций, но здесь может не подойти : отбой выдается при попытке записи на измененый рекорд (то есть кто-то насиловал статью зря). Кроме того в этом режиме транакции могут жить только несколько минут (зависит от нагрузки). -- обработка трансакций (статусов) на апликации. На рекор добавляются три поля, кто, как и когда поледний раз трогал запись. Важно тут то, что аппликация может применить таймаут: если Вася два часа тому назад взял статью на редакцию и свалил к теще на блины, то Петя перепишет эти 3 поля и смовет 10 раз подправить статейку. Понятно, Вася поутру получит отлуп при попытке сохранить свою старую версию. ЙЙ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 15:25 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
Спасибо) я так и предполагал...но думал что что-то пропустил в самообразовании...Как я и предполагал лучший способ -третий вариант -изменить немного таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 16:22 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
В третьем случае можно обойтись без дополнительных полей вообще. Перед посылкой основной транзакции просто сравниваете данные строки перед модификацией с тем, что есть в базе (методика постоянно используется в html'ных формах). Если есть разница - строка менялась и клиенту надо дать предложение на перезапрос, иначе начинать транзакцию. Недостаток - надо иметь на клиенте старую версию строки и отсутствие таймаута. Впрочем, нормальный администратор сам выставит таймауты на подобные "висюки". В случае с лишними полями не забудьте ставить commit на строку в приложении сразу после их изменения иначе получите ту же блокировку. Вопрос - все это вам надо? Особенно если учесть, что "насильник" все равно выяснит, что работал зря (случай и второй, и третий с этой точки зрения ничем не отличаются). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 17:59 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
Ne sovsem soglasen s <quote> В третьем случае можно обойтись без дополнительных полей вообще. Перед посылкой основной транзакции просто сравниваете данные строки перед модификацией с тем, что есть в базе (методика постоянно используется в html'ных формах). Если есть разница - строка менялась и клиенту надо дать предложение на перезапрос, иначе начинать транзакцию. Недостаток - надо иметь на клиенте старую версию строки и отсутствие таймаута. Впрочем, нормальный администратор сам выставит таймауты на подобные "висюки". В случае с лишними полями не забудьте ставить commit на строку в приложении сразу после их изменения иначе получите ту же блокировку. Вопрос - все это вам надо? Особенно если учесть, что "насильник" все равно выяснит, что работал зря (случай и второй, и третий с этой точки зрения ничем не отличаются). </quote> Kak sledyet iz nachal'nogo voprosa, zadacha stoit v obrabotke "long transactions in multi-user environment", kogda redactirovanie mozhet zaniat' minuty-chasi. V takoi situacii database transactions and TX level NE MOGYT rabotat' -oni trebuut "stateful connection" design. Long transactions dolzhny bit' stateless po otnosheniy k klienty i dolzhni bit' sdelany s pomosh'u dopolnitel'nix poley (status, flags) i ymnoy applikacii. Variant 2 (TX level = SERILIZABLE) ne predypredit chto rekord "zaniat". Predlozhenniy variant s soxraneniem starix znacheniy na kliente ivliaetsia "stateless" optimistik locking no tozhe ne predypredit o zaniatosti rekorda. JJ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 21:31 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
2 javajdbc А разве я что-то сказал, противоречащее Вашему утверждению? Естественно, что длинные транзакции должны блокировать строки не так, как короткие. Я просто предложил еще один вариант "ymnoy applikacii", не требующей дополнительных полей в таблице. В Вашем варианте тоже не все гладко - вопрос в том, чтО заносить в дополнительные поля. Например, если все пользователи коннектятся к одной схеме (что-нибудь вроде R3, Oracle Applications или любой большой системы) - имя схемы в качестве флага не подойдет. Так же как не подойдет и адрес сессии, если сессии постоянно открываются/закрываются (опять-таки html). Еще предлагаю исключить патологический в нашем случае рецепт set transactions serializable; и не отстаивать свой вариант как единственно верный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 10:12 |
|
||
|
Транзакции
|
|||
|---|---|---|---|
|
#18+
AL, Еще предлагаю исключить патологический в нашем случае рецепт set transactions serializable; и не отстаивать свой вариант как единственно верный. Согласен, и не коим образом не настаиваю. Мы просто обсуждаем преимущества и недостатки возможных решений в не совсем четко поставленной задаче. Теперь по деталям. Сохранение старых значений - это основное решение если таблицы менять нельзя. Этот метод абсолютно правильно будет отрабатывать трансакции. Наличие флагов/статусов дает дополнительный сервис: (если он нужен!!!!) Например, если супервайзор открывает статью, он может получить сообщение типа: "статья такаята взята на редактирование В.Пупкиным. 2.5 часа назад. Вы можете (1) открыть для просмотра только (2) открыть статью для редактирования и убрать возможность В Пупкина сохранить его редакцию. (3) выйти из апликации. " В Вашем варианте тоже не все гладко - вопрос в том, чтО заносить в дополнительные поля. Например, если все пользователи коннектятся к одной схеме (что-нибудь вроде R3, Oracle Applications или любой большой системы) - имя схемы в качестве флага не подойдет. Так же как не подойдет и адрес сессии, если сессии постоянно открываются/закрываются (опять-таки html). В статусных полях можно хранить время и логнаме. Я не совсем понял, какие тут могут быть трудности? Даже в многослойной аппликации передать клиентский юсернаме в базу не есть проблема. ЙЙ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2003, 15:05 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1991397]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 456ms |

| 0 / 0 |
