Почему SQL*Plus фиксирует на выходе?

Что-то я столкнулся с попыткой сделать это прежде, - то, что немного веб-страниц являются правильно построенными XML-документами. Hpricot может быть в состоянии иметь дело с тем (я не использовал его), но когда я делал подобный проект в прошлом (использующий Python, и его библиотека создала в парсинге функций), он помог иметь препроцессор для чистки HTML. Я использовал привязку Python для HTML, Опрятный как это, и он сделал жизнь намного легче. Привязка Ruby здесь , но я не судил их.

Удачи!

14
задан Chris Gill 2 September 2009 в 15:15
поделиться

5 ответов

Как ни странно, с выпуском 11gR2 на этой неделе (2009-09 -03), SQL * Plus теперь имеет возможность COMMIT или ROLLBACK при EXIT. Документ здесь

Я предполагаю, что в ближайшие несколько недель / месяцев появится мгновенный клиент 11gR2, который вы можете использовать в своей текущей базе данных и добиться желаемого поведения.

Предупреждение, о котором следует помнить . Если вы ОТКЛЮЧИТЕ или ПОДКЛЮЧИТЕ к другому сеансу, транзакция все равно будет неявно зафиксирована (согласно документу).

18
ответ дан 1 December 2019 в 09:13
поделиться

Это было дизайнерское решение Oracle, вероятно, принятое более 20 лет назад. Я бы использовал не такой дизайн. Обратите внимание, что это, по-видимому, свойство SQL * Plus, а не базового OCI.

Если сеанс внезапно завершается, AFAIK, сеанс откатывается, как и следовало ожидать. Так, например, если кто-то отправляет SIGKILL на SQL Plus, транзакция сеанса должна быть отменена. Но если сеанс SQL Plus завершается корректно (EOF или команда выхода), тогда SQL * Plus в своей бесконечной мудрости решает зафиксировать все, что вы сделали до сих пор.

Что касается почему - у меня есть теория. В стандартных базах данных SQL вы всегда находитесь в транзакции, даже если единственная выполняемая вами операция - это оператор SELECT. Если вы не зафиксируете, то любые внесенные вами изменения будут отменены. Легко забыть добавить фиксацию в конец операций со сценарием, поэтому, сделав его поведением по умолчанию, уменьшилось количество раз, когда кто-то запускал сценарий для изменения базы данных, а затем запускал второй сценарий, чтобы проверить, правильно ли вступили в силу изменения. Другие СУБД устраняют необходимость в этом с помощью таких режимов, как «автоматическая фиксация», где каждый оператор является отдельной транзакцией, автоматически фиксируемой по завершении. Это полезный режим работы. Другие системы предоставляют режим, в котором вы находитесь в режиме автоматической фиксации, пока не запустите явный оператор BEGIN WORK, после чего (конечно) вы находитесь в транзакции до соответствующего COMMIT или ROLLBACK. Я был пойман базами данных MODE ANSI, которые не фиксируют достаточно часто, чтобы убедиться, что я фиксирую, когда это важно, но программное обеспечение, которое я использую (не Oracle), по-прежнему откатывает незавершенную работу, а не молча фиксирует ее за вас - и я был бы недоволен, если бы она была изменена для работы в противном случае. (Я полагаю, что настраиваемое значение по умолчанию может быть в порядке; я по-прежнему считаю, что откат незафиксированный - лучшее значение по умолчанию, поскольку все это неприятно для неосведомленных; меньше опасность случайного повреждения базы данных, и это имеет для меня первостепенное значение.)

( Должное уведомление: Это информация из вторых рук от кого-то, кто работает на другого поставщика СУБД. Однако, насколько мне известно, она точна и основана на информации, накопленной за более длительный период. более десяти лет и задав соответствующие вопросы на различных форумах.)

Это информация из вторых рук от кого-то, кто работает на другого поставщика СУБД. Однако, насколько мне известно, он точен и основан на информации, накопленной за более чем десятилетний период после того, как я задавал соответствующие вопросы на различных форумах.)

Это информация из вторых рук от кого-то, кто работает на другого поставщика СУБД. Однако, насколько мне известно, он точен и основан на информации, накопленной за более чем десятилетний период после того, как я задавал соответствующие вопросы на различных форумах.)

6
ответ дан 1 December 2019 в 09:13
поделиться

Вы должны спросить Oracle!

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

Я могу только догадываться, что COMMIT считается наиболее вероятным действием / действием по умолчанию, и, может быть, именно поэтому SQL * Plus это делает?

3
ответ дан 1 December 2019 в 09:13
поделиться

Хороший вопрос.

Я посмотрел на metalink и обнаружил ошибку (или запрос на изменение) в отношении поведения по умолчанию фиксации при нормальном выходе еще в 1998 году. Если у вас есть доступ к metalink, поищите ошибку 633247.

1
ответ дан 1 December 2019 в 09:13
поделиться

Я думаю, что коммит - хорошая идея, и я согласен с тем, что Джастин и Билли написали в этой ветке: http://forums.oracle.com/forums/thread.jspa? messageID = 3611345 & # 3611345

С уважением, Роб.

0
ответ дан 1 December 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: