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

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

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

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

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

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


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

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

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

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

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

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

Закомментировал ненужные коммиты, всё пока нормально работает, нигде ничего не блокируется.
Уровень изоляции нигде явно не меняется, так что он по умолчанию (READ COMMITTED)
Ну а вообще как эти самые коммиты (которые ничего не коммитят) влияют на жизнь базы?
...
Рейтинг: 0 / 0
19.03.2003, 11:20
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Коммит после селекта / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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