powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Транзакции
13 сообщений из 13, страница 1 из 1
Транзакции
    #32122755
Begemot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите, не смог найти никгде ответа...Я раньше работал с Интербейс и только начинаю с Ораклом.
какой уровень изоляции и тип транзакции надо установить, чтобы если пользователь открыл данные с ключом for update, другие делая выборку не могли выбрать эти данные даже на чтение...Или такое нельзя?
...
Рейтинг: 0 / 0
Транзакции
    #32122771
Delerium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Begemot, v Oracle takoje dazhe i njenuzhno!
...
Рейтинг: 0 / 0
Транзакции
    #32122799
Begemot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а такая ситуация ....нужно обрабатывать заметки в базе..работает несколько человек...как предусмотреть ситуация, когда с одно статьей будут работать несколько человек?ведь это трата рабочего времени
...
Рейтинг: 0 / 0
Транзакции
    #32122807
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть недокументированная фича: select .. for update skip locked. Она _недокументирована_ , со всеми вытекающими.
...
Рейтинг: 0 / 0
Транзакции
    #32122814
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В оракуле нельзя запретить чтение заблокированных кем-то данных (если, разумеется, у читателя есть права на чтение). А решение проблемы очень простое - если один юзер начинает изменение, то клиентское приложение посылает select ... for update nowait и проверяет ошибку. Есть - кто-то уже работает с записью - надо сказать юзеру, чтобы подождал освобождения записи и обязательно перезапросил ее, чтобы увидеть новые данные. Нет - все нормально - блокировка прошла и можно править.
...
Рейтинг: 0 / 0
Транзакции
    #32122914
ksukhonosenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запретить чтение нельзя - писатели читателей не блокируют (имхо :)). Надо всех обязать использовать select for update для операций изменения данных. Если этот код локализован - нет проблем, иначе - большие проблемы, если одновременное редактирование это нормальное дело в вашей ситуации.

Кстати, вопрос - если запись редактируется долго и содерит ссылки на другие таблицы/на нее ссылаются - это как-то может заблокировать еще и их?
...
Рейтинг: 0 / 0
Транзакции
    #32122923
Delerium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
K statji - jeslji pomenjatj vsje "select" na "select for update", mozhno ozhidatj davoljno bolshoj prirost redo informaciiji i posljedovatejno snjizhenjije proizvaditeljnostji.
...
Рейтинг: 0 / 0
Транзакции
    #32123016
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри доки, например здесь
http://www.csee.umbc.edu/help/oracle8/server.815/a67775/ch9_tran.htm

Есть (как минимум) 3 варианта

-- все селекты делаются FOR UPDATE (пессимистик лок).
Не рекомендуется при частых запросах, особено если
кто из "писателей" любит пить кофе по 2 часа бросив
комп с открытым документом.

-- трансактион левел - СЕРИАЛИЗАБЛЕ (оптимистик лок).
Вполне удачный вариант во многих сутиаций, но здесь
может не подойти : отбой выдается при попытке записи
на измененый рекорд (то есть кто-то насиловал статью
зря). Кроме того в этом режиме транакции могут жить
только несколько минут (зависит от нагрузки).

-- обработка трансакций (статусов) на апликации.
На рекор добавляются три поля, кто, как и когда поледний раз
трогал запись. Важно тут то, что аппликация может
применить таймаут: если Вася два часа тому назад
взял статью на редакцию и свалил к теще на блины,
то Петя перепишет эти 3 поля и смовет 10 раз
подправить статейку. Понятно, Вася поутру
получит отлуп при попытке сохранить свою старую
версию.

ЙЙ
...
Рейтинг: 0 / 0
Транзакции
    #32123081
Begemot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо) я так и предполагал...но думал что что-то пропустил в самообразовании...Как я и предполагал лучший способ -третий вариант -изменить немного таблицу
...
Рейтинг: 0 / 0
Транзакции
    #32123178
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В третьем случае можно обойтись без дополнительных полей вообще. Перед посылкой основной транзакции просто сравниваете данные строки перед модификацией с тем, что есть в базе (методика постоянно используется в html'ных формах). Если есть разница - строка менялась и клиенту надо дать предложение на перезапрос, иначе начинать транзакцию. Недостаток - надо иметь на клиенте старую версию строки и отсутствие таймаута. Впрочем, нормальный администратор сам выставит таймауты на подобные "висюки".

В случае с лишними полями не забудьте ставить commit на строку в приложении сразу после их изменения иначе получите ту же блокировку.

Вопрос - все это вам надо? Особенно если учесть, что "насильник" все равно выяснит, что работал зря (случай и второй, и третий с этой точки зрения ничем не отличаются).
...
Рейтинг: 0 / 0
Транзакции
    #32123258
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Транзакции
    #32123432
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 javajdbc

А разве я что-то сказал, противоречащее Вашему утверждению? Естественно, что длинные транзакции должны блокировать строки не так, как короткие. Я просто предложил еще один вариант "ymnoy applikacii", не требующей дополнительных полей в таблице. В Вашем варианте тоже не все гладко - вопрос в том, чтО заносить в дополнительные поля. Например, если все пользователи коннектятся к одной схеме (что-нибудь вроде R3, Oracle Applications или любой большой системы) - имя схемы в качестве флага не подойдет. Так же как не подойдет и адрес сессии, если сессии постоянно открываются/закрываются (опять-таки html).

Еще предлагаю исключить патологический в нашем случае рецепт set transactions serializable; и не отстаивать свой вариант как единственно верный.
...
Рейтинг: 0 / 0
Транзакции
    #32123852
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AL,

Еще предлагаю исключить патологический в нашем случае рецепт set transactions serializable; и не отстаивать свой вариант как единственно верный.
Согласен, и не коим образом не настаиваю. Мы просто обсуждаем преимущества и недостатки возможных решений в не совсем четко поставленной задаче.

Теперь по деталям. Сохранение старых значений - это основное
решение если таблицы менять нельзя. Этот метод
абсолютно правильно будет отрабатывать трансакции.

Наличие флагов/статусов дает дополнительный сервис:
(если он нужен!!!!)
Например, если супервайзор открывает статью, он может получить
сообщение типа: "статья такаята взята на редактирование
В.Пупкиным. 2.5 часа назад. Вы можете (1) открыть для
просмотра только (2) открыть статью для редактирования
и убрать возможность В Пупкина сохранить его редакцию.
(3) выйти из апликации. "

В Вашем варианте тоже не все гладко - вопрос в том, чтО заносить в дополнительные поля. Например, если все пользователи коннектятся к одной схеме (что-нибудь вроде R3, Oracle Applications или любой большой системы) - имя схемы в качестве флага не подойдет. Так же как не подойдет и адрес сессии, если сессии постоянно открываются/закрываются (опять-таки html).

В статусных полях можно хранить время и логнаме. Я не совсем
понял, какие тут могут быть трудности? Даже в многослойной
аппликации передать клиентский юсернаме в базу не есть проблема.

ЙЙ
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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