powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Коммит после селекта
13 сообщений из 13, страница 1 из 1
Коммит после селекта
    #32121965
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Досталась в наследство одна прога, работающая с оракловой базой. И обнаружил я в ней странные (на мой взгляд конструкции) типа
begin
MainSQL.Open;
MainData.MainSession.Commit;
end;

Т.е. после КАЖДОГО селекта стоит коммит! Вот и мучает меня вопрос - зачем так сделано и нужно ли это ... ? И как это влияет на жизнь базы ?
А разработчика уже нету в России... Но, насколько я знаю, он на оракл с интербейза переползал, так может это рудимент какой интербейзовский ?
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122013
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например, под select-ом вызавается процедура, которая update-ить некую таблицу
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122018
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или еще по крайней мере 2 варианта:

1. Программа работала с БД, в которой возможна блокировка при select'е, дело связано с необходимостью синхронизации данных на момент чтения. Если в Oracle при уровне изоляции READ COMMITTED позволяет остальным сессиям изменять записи, когда кто-то из выбирает в select'е, то, к примеру, в Sybase это вполне возможно. Может быть и в версионнике-Interbase такое тоже случается.

2. Устанавливался какой-то уровень изоляции типа repeated read, если это возможно в Interbase.
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122028
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexandr Plus
Попробуйте вызвать функцию с DML в select - Вы получите ошибку выполнения.

Скорее всего, это просто фиксация read-only транзакции. Может, где-то есть команда set transaction read only. А может просто глюк разработчика (что гораздо более вероятная вещь). Много таких по свету ходит, которые, к примеру, перед DML дают lock table in xxx mode...
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122041
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"например, под select-ом вызавается процедура, которая update-ить некую таблицу"

Можно поподробнее, это как?
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122060
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каюсь.
Жаргонизм локальный.
То есть это Delphi и все что в выражении SQL "селектами"
величали. Но под SQL можно писать PL/SQL-текст, а там много-чего для commit может подойти.
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122068
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
begin
MainSQL.Open;
MainData.MainSession.Commit;
end;


А где здесь select? Откуда такая уверенность? Из-за
MainSQL.Open?
Но Open - это признак существования возвращаемых данных (в противоположенность Execute).
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122075
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно.
Чего мы гадаем-то на кофейной гуще. "Купились" :-)
Есть некие имена - MainSQL - которыми можно назвать что-угодно, например, TЧтоТоDataSet и при открытии, например, срабатывает триггер BeforeOpen,
который может делать непоймичто.
И компонентов Delphi уже много.
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122510
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, залез, глянул, что там у нас за MainSQL :-)
Это обычный TOraQuery, и в нем обычный SQL-запрос - select * from table

Всё, что может изменять данные в таблицах, расположено отдельно от компонентов, просто извлекающих данные.
Команды set transaction read only в коде не нашел (также нигде не фигурирует просто transaction) Нигде нет и lock table...
Ведь я почему и спросил - этот самый MainSQL (да и не он один) гарантировано НЕ меняет данные, НЕ блокирует строки (select for update), так может действительно COMMIT не нужен после ОБЫЧНОГО select ?
И как могут влиять эти commit'ы на жизнь базы?

Блин, фигово быть во Владивостоке. Когда вы только начинаете в форуме появляться, мне уже спать хочется :-)))
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122525
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как уже указали Ал и Денис, при высоком уровне
изоляции трансакций (на примере сериалазабле на Оракле)
селект таки копирует рекорды в сторонку (значение "А").
Затем сессия изменяет данные на "Б" и комитит. Здесь Оракле
сравнивает "А" (старое значение!) с текущим значением.
Если совпадает - записывает "Б" и все довольны. Если
какая нибудь левая БЛ записала туда "С" и откомитила,
то описываемой трансакции дается отбой.
(оптимистик локинг)

При таком TX level комит после селекта удаляет все
отложенные рекорды и ,скорее всего (?), не разрешит
изменять их вообще.

При TX level = READ_COMMITED комит после селекта смысла
не имеет. Так что проверь уровень изоляции и еще раз
просмотри логику на предмет трансакций. Если где есть подвох,
так ето в них (шоб они были здоровы).

ЙЙ
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122548
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Скорее всего это от интербэйза.
Там ведь как бы shapshot создается при логоне, и пока commit не сделаешь (явно), данные в нем не обновятся. Только делать его надо ДО селекта.
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122575
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Залез в IBExpert - делаешь селект в редакторе, закрываешь окно и он спрашивает - активная транзакция, rollback, commit , cancel. Так что скорее всего рудиментарная привычка от интербейза осталась.

Закомментировал ненужные коммиты, всё пока нормально работает, нигде ничего не блокируется.
Уровень изоляции нигде явно не меняется, так что он по умолчанию (READ COMMITTED)
Ну а вообще как эти самые коммиты (которые ничего не коммитят) влияют на жизнь базы?
...
Рейтинг: 0 / 0
Коммит после селекта
    #32122698
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой вот еще вариант объяснения: в Interbase выборка записей из таблицы накладывает на нее какие-то блокировки. Может быть они не мешают другим запросам выбирать или даже изменять те же строки, но наличие этих блокировок не позволит провести DDL-операцию над таблицей. В Oracle нечто похожее получается при попытке произвести DDL-операцию над таблицей при наличии незавершенных изменений данных:

Код: plaintext
1.
2.
create table test(tesr_id number( 9 ));
insert into test values ( 1 );


Не говорим commit'а, теперь в другой сессии:
Код: plaintext
1.
2.
3.
4.
5.
dan@oraspb>; alter table test modify test_id number( 10 );
alter table test modify test_id number( 10 )
*
ERROR at line  1 :
ORA- 00054 : resource busy and acquire with NOWAIT specified


Т.е. разработчик при использовании Interbase возможно просто вынужден говорить commit после select'а, чтобы иметь возможность изменения структуры во время работы. ИМХО можно обратиться в эху по Interbase с кототким вопросом "Зачем говорить commit после select'а".
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Коммит после селекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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