Подтвердить что ты не робот

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

Неужели это должно быть таким же, как прекращение сеанса и причиной отката? Мне кажется, что это самая необычная вещь. Я был потрясен, когда узнал, что он сделал это

Что еще более важно - кто-нибудь возразит, если Oracle изменит его на откат при выходе?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

В соответствии с тем, как соединение jdbc с использованием драйвера Oracle неявно фиксирует txn при закрытии соединения.

Ответ 6

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

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

Ответ 7

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