Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Теоретические аспекты и практические реализации создания, внедрения и использования баз данных, СУБД, хранилищ.
  • Страница:
  • 1
  • 2
  • 3

ТЕМА: Как отличить блокировки в Oracle

Re: Как отличить блокировки в Oracle 16 июль 2011 13:07 #2100

  • Joker
  • Joker аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 46
  • Спасибо получено: 0

После возвращения мне управления ...


Я бы задумался о правильности разбиения транзакции между несколькими независимыми разработчиками уже на этом предложении...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Как отличить блокировки в Oracle 16 июль 2011 13:08 #2101

  • Dior
  • Dior аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 41
  • Спасибо получено: 0

После возвращения мне управления возможны следующие реакции
1. Вызываемая форма сделала Commit. Я ничего не делаю
2. Форма не сделала никаких DML-операций, но и не завершила транзакцию. Мне нужно откатить до SavePoint
3. Форма сделала какие-то DML-операций и не завершила транзакцию. Мне не нужно ничего делать

С учётом 1 и 3 я бы распространил "мне не нужно ничего делать" и на 2. То есть, управление завершением транзакции переходит на разработчиков форм. И уже они определяют, когда ROLLBACK TO SAVEPOINT, когда COMMIT, а когда "продолжение в следующей серии". Возможно, используя предоставляемое Вами API на PL/SQL из трёх процедур: do_commit, do_rollback, do_continue. :)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Как отличить блокировки в Oracle 16 июль 2011 13:09 #2102

  • Olessa
  • Olessa аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 42
  • Спасибо получено: 0

С учётом 1 и 3 я бы распространил "мне не нужно ничего делать" и на 2. То есть, управление завершением транзакции переходит на разработчиков форм. И уже они определяют, когда ROLLBACK TO SAVEPOINT, когда COMMIT, а когда "продолжение в следующей серии". Возможно, используя предоставляемое Вами API на PL/SQL из трёх процедур: do_commit, do_rollback, do_continue. :)


Откат к SavePoint необходим для того, чтобы снять блокировку с записи, установленную Select for update.
Разработчики формы не знают имени этого SavePoint, да и не их дело препятствовать одновременному открытию их формы (в других местах использования их формы это вполне возможно).

В этой системе разработчик формы заранее не может знать - самодостаточный ли функционал его форма, звено ли она в некой цепи функционалов или только маленькая часть какой-то большой и долгой транзакции.

Если же в случае 2 вовсе не делать откатов, то при простом хождении по Системе без изменения данных мы имеем фигову тучу ничем не обоснованных блокировок

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Как отличить блокировки в Oracle 16 июль 2011 13:10 #2103

  • Gubin
  • Gubin аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 42
  • Спасибо получено: 0

После возвращения мне управления возможны следующие реакции
1. Вызываемая форма сделала Commit. Я ничего не делаю
2. Форма не сделала никаких DML-операций, но и не завершила транзакцию. Мне нужно откатить до SavePoint
3. Форма сделала какие-то DML-операций и не завершила транзакцию. Мне не нужно ничего делать


Нельзя сказать, что к разработке форм не предъявляется никаких требований. Какие-то соглашения всё же есть. Но они вовсе не жёсткие.


ИМХО,
тут как раз лучше четко разделить ответственность за транзакции, т.е. либо
1) Форма начинает транзакцию и она же обязана ее завершить, сделав commit или rollback.

либо

2) Форма делает/не делает изменения, и возвращает результат, в зависимости от которого в базовом модуле делается commit или rollback, или пока ничего не делается и транзакция продолжается. В этом случае базовый модуль может объединить изменения нескольких форм в одной транзакции.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Как отличить блокировки в Oracle 16 июль 2011 13:12 #2104

  • Olessa
  • Olessa аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 42
  • Спасибо получено: 0

тут как раз лучше четко разделить ответственность за транзакции, т.е. либо
1) Форма начинает транзакцию и она же обязана ее завершить, сделав commit или rollback.
либо
2) Форма делает/не делает изменения, и возвращает результат, в зависимости от которого в базовом модуле делается commit или rollback, или пока ничего не делается и транзакция продолжается. В этом случае базовый модуль может объединить изменения нескольких форм в одной транзакции.


Надо пояснить, что я не разрабатываю "операционную систему". Формы формально равноправны.
Тот, кто вызывает чужую форму сам может вызываться в рамках какой-то общей длинной транзакции.
Именно по этому я не могу делать ни Commit, ни Rollback. Я могу только
а). Наложить блокировку
б). Попытаться снять блокировку, если нет незакоммиченных DML-операций.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Как отличить блокировки в Oracle 16 июль 2011 13:14 #2105

  • Dior
  • Dior аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 41
  • Спасибо получено: 0

В этой системе разработчик формы заранее не может знать - самодостаточный ли функционал его форма, звено ли она в некой цепи функционалов или только маленькая часть какой-то большой и долгой транзакции.

Да ладно, а как же:

1. Вызываемая форма сделала Commit. Я ничего не делаю

Раз сделала commit, значит разработчик что-то знал. Кто собирает формы в цепочки и транзакции, тот и определяет, что и когда блокировать, фиксировать и откатывать. У разработчика формы должна быть обязанность завершить транзакцию каким-либо образом: откатить изменения, зафиксировать их, снять блокировку при отсутствии изменений. Дайте ему API, который может изменять статус формы, например, переменную пакета. При вызове API меняйте статус: do_commit - 1, do_rollback - 0, do_release_lock - null. А потом проверяйте его значение, других изменений из формы не было - можно откатиться до точки сохранения. Проверяйте статус и выполняйте нужное действие.

PS: Кроличья нора становится всё глубже.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
  • 3