|
|
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
Досталась в наследство одна прога, работающая с оракловой базой. И обнаружил я в ней странные (на мой взгляд конструкции) типа begin MainSQL.Open; MainData.MainSession.Commit; end; Т.е. после КАЖДОГО селекта стоит коммит! Вот и мучает меня вопрос - зачем так сделано и нужно ли это ... ? И как это влияет на жизнь базы ? А разработчика уже нету в России... Но, насколько я знаю, он на оракл с интербейза переползал, так может это рудимент какой интербейзовский ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 12:35 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
например, под select-ом вызавается процедура, которая update-ить некую таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 13:00 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
или еще по крайней мере 2 варианта: 1. Программа работала с БД, в которой возможна блокировка при select'е, дело связано с необходимостью синхронизации данных на момент чтения. Если в Oracle при уровне изоляции READ COMMITTED позволяет остальным сессиям изменять записи, когда кто-то из выбирает в select'е, то, к примеру, в Sybase это вполне возможно. Может быть и в версионнике-Interbase такое тоже случается. 2. Устанавливался какой-то уровень изоляции типа repeated read, если это возможно в Interbase. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 13:04 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
2 Alexandr Plus Попробуйте вызвать функцию с DML в select - Вы получите ошибку выполнения. Скорее всего, это просто фиксация read-only транзакции. Может, где-то есть команда set transaction read only. А может просто глюк разработчика (что гораздо более вероятная вещь). Много таких по свету ходит, которые, к примеру, перед DML дают lock table in xxx mode... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 13:11 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
"например, под select-ом вызавается процедура, которая update-ить некую таблицу" Можно поподробнее, это как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 13:18 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
Каюсь. Жаргонизм локальный. То есть это Delphi и все что в выражении SQL "селектами" величали. Но под SQL можно писать PL/SQL-текст, а там много-чего для commit может подойти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 13:27 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
begin MainSQL.Open; MainData.MainSession.Commit; end; А где здесь select? Откуда такая уверенность? Из-за MainSQL.Open? Но Open - это признак существования возвращаемых данных (в противоположенность Execute). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 13:33 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
Действительно. Чего мы гадаем-то на кофейной гуще. "Купились" :-) Есть некие имена - MainSQL - которыми можно назвать что-угодно, например, TЧтоТоDataSet и при открытии, например, срабатывает триггер BeforeOpen, который может делать непоймичто. И компонентов Delphi уже много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 13:44 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
Ок, залез, глянул, что там у нас за MainSQL :-) Это обычный TOraQuery, и в нем обычный SQL-запрос - select * from table Всё, что может изменять данные в таблицах, расположено отдельно от компонентов, просто извлекающих данные. Команды set transaction read only в коде не нашел (также нигде не фигурирует просто transaction) Нигде нет и lock table... Ведь я почему и спросил - этот самый MainSQL (да и не он один) гарантировано НЕ меняет данные, НЕ блокирует строки (select for update), так может действительно COMMIT не нужен после ОБЫЧНОГО select ? И как могут влиять эти commit'ы на жизнь базы? Блин, фигово быть во Владивостоке. Когда вы только начинаете в форуме появляться, мне уже спать хочется :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 02:17 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
Как уже указали Ал и Денис, при высоком уровне изоляции трансакций (на примере сериалазабле на Оракле) селект таки копирует рекорды в сторонку (значение "А"). Затем сессия изменяет данные на "Б" и комитит. Здесь Оракле сравнивает "А" (старое значение!) с текущим значением. Если совпадает - записывает "Б" и все довольны. Если какая нибудь левая БЛ записала туда "С" и откомитила, то описываемой трансакции дается отбой. (оптимистик локинг) При таком TX level комит после селекта удаляет все отложенные рекорды и ,скорее всего (?), не разрешит изменять их вообще. При TX level = READ_COMMITED комит после селекта смысла не имеет. Так что проверь уровень изоляции и еще раз просмотри логику на предмет трансакций. Если где есть подвох, так ето в них (шоб они были здоровы). ЙЙ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 05:14 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
Скорее всего это от интербэйза. Там ведь как бы shapshot создается при логоне, и пока commit не сделаешь (явно), данные в нем не обновятся. Только делать его надо ДО селекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 08:02 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
Залез в IBExpert - делаешь селект в редакторе, закрываешь окно и он спрашивает - активная транзакция, rollback, commit , cancel. Так что скорее всего рудиментарная привычка от интербейза осталась. Закомментировал ненужные коммиты, всё пока нормально работает, нигде ничего не блокируется. Уровень изоляции нигде явно не меняется, так что он по умолчанию (READ COMMITTED) Ну а вообще как эти самые коммиты (которые ничего не коммитят) влияют на жизнь базы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 09:03 |
|
||
|
Коммит после селекта
|
|||
|---|---|---|---|
|
#18+
Такой вот еще вариант объяснения: в Interbase выборка записей из таблицы накладывает на нее какие-то блокировки. Может быть они не мешают другим запросам выбирать или даже изменять те же строки, но наличие этих блокировок не позволит провести DDL-операцию над таблицей. В Oracle нечто похожее получается при попытке произвести DDL-операцию над таблицей при наличии незавершенных изменений данных: Код: plaintext 1. 2. Не говорим commit'а, теперь в другой сессии: Код: plaintext 1. 2. 3. 4. 5. Т.е. разработчик при использовании Interbase возможно просто вынужден говорить commit после select'а, чтобы иметь возможность изменения структуры во время работы. ИМХО можно обратиться в эху по Interbase с кототким вопросом "Зачем говорить commit после select'а". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2003, 11:20 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32122028&tid=1991423]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
185ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 512ms |

| 0 / 0 |
