Oracle что быстрее commit или rollback
I have a read query that I execute within a transaction so that I can specify the isolation level. Once the query is complete, what should I do?
- Commit the transaction
- Rollback the transaction
- Do nothing (which will cause the transaction to be rolled back at the end of the using block)
What are the implications of doing each?
EDIT: The question is not if a transaction should be used or if there are other ways to set the transaction level. The question is if it makes any difference that a transaction that does not modify anything is committed or rolled back. Is there a performance difference? Does it affect other connections? Any other differences?
You probably know about this already, but given the example you've provided, you may have equivalent results by simple executing the query: SELECT * FROM SomeTable with NOLOCK
@Stefan, it seems that most of us wonder why you are bothering to transact on a read only operation. Can you let us know if you know about NOLOCK and if you do, why you didnt go that route.
I know about NOLOCK, but this system operates against different databases as well as SQL Server, so I'm trying to avoid SQL Server specific locking hints. This is a question more out of curiosity than anything else as the application is working fine with the code above.
Ah, in that case I am removing the sqlserver tag, because that denotes MSSqlServer as the target product.
Команда SAVEPOINT
Устанавливает в транзакции именованный маркер, позволяющий в случае необходимости выполнить откат до отмеченной точки сохранения. При таком откате отменяются все изменения и удаляются все блокировки после этой точки, но сохраняются изменения и блокировки, предшествовавшие ей. Синтаксис команды SAVEPOINT :
Область действия точки сохранения не ограничивается блоком PL/SQL, в котором она установлена. Если в ходе транзакции имя точки сохранения используется повторно, эта точка просто «перемещается» в новую позицию, причем независимо от процедуры, функции или анонимного блока, в котором выполняется команда SAVEPOINT . Если точка сохранения устанавливается в рекурсивной программе, на самом деле на каждом уровне рекурсии она задается заново, но откат может быть возможен только к одной точке — той, что установлена последней.
Команда COMMIT
Фиксирует все изменения, внесенные в базу данных в ходе сеанса текущей транзакцией. После выполнения этой команды изменения становятся видимыми для других сеансов или пользователей. Синтаксис этой команды:
Ключевое слово WORK не обязательно — оно только упрощает чтение кода.
Ключевое слово COMMENT также не является обязательным; оно используется для задания комментария, который будет связан с текущей транзакцией. Текстом комментария должен быть заключенный в одинарные кавычки литерал длиной до 50 символов. Обычно комментарии задаются для распределенных транзакций с целью облегчения их анализа и разрешения сомнительных транзакций в среде с двухфазовой фиксацией. Они хранятся в словаре данных вместе с идентификаторами транзакций.
Обратите внимание: команда COMMIT снимает все блокировки таблиц, установленные во время текущего сеанса (например, для команды SELECT FOR UPDATE ). Кроме того, она удаляет все точки сохранения, установленные после выполнения последней команды COMMIT или ROLLBACK .
После того как изменения будут закреплены, их откат становится невозможным.
Все команды в следующем фрагменте являются допустимыми применениями COMMIT :
Синтаксис автономной транзакции
В приведенном выше синтаксисе блок был выполнен как автономная транзакция.
откат.
. обычно означает отбрасывание (или скрытие) любых локальных изменений и сброс ветви до фиксации (или просто проверка фиксации, но это помещает вас в состояние отсоединенной головы) до фиксации тот, где все начинает путаться. Использовать
12 Answers 12
You commit. Period. There's no other sensible alternative. If you started a transaction, you should close it. Committing releases any locks you may have had, and is equally sensible with ReadUncommitted or Serializable isolation levels. Relying on implicit rollback - while perhaps technically equivalent - is just poor form.
If that hasn't convinced you, just imagine the next guy who inserts an update statement in the middle of your code, and has to track down the implicit rollback that occurs and removes his data.
There is a sensible alternative - rollback. Explicit rollback, that is. If you didn't mean to change anything, rollback ensures anything is undone. Of course, there shouldn't have been any changes; rollback guarantees that.
Different DBMS can have different 'implicit transaction completion' semantics. IBM Informix (and I believe DB2) do implicit rollback; by rumour, Oracle does an implicit commit. I prefer implicit rollback.
Suppose I create a temp table, populate it with ids, join it with a data table to select the data that goes with the ids, then delete the temp table. I'm really just reading data, and I don't care what happens to the temp table, since it's temporary. but from a performance perspective, would it be more expensive to rollback the transaction or commit it? What's the effect of a commit/rollback when nothing but temp tables and read operations are involved?
@Triynko - The only way to optimize is to profile. It's such a simple code change, there's no reason not to profile both methods if you really want to optimize it. Make sure to update us with results!
If you haven't changed anything, then you can use either a COMMIT or a ROLLBACK. Either one will release any read locks you have acquired and since you haven't made any other changes, they will be equivalent.
Thanks for letting me know they are equivalent. In my opinion, this best answers the actual question.
it would give transaction is inactive if we use commit with no actual updates. i just faced it on my live site
If you begin a transaction, then best practice is always to commit it. If an exception is thrown inside your use(transaction) block the transaction will be automatically rolled-back.
IMHO it can make sense to wrap read only queries in transactions as (especially in Java) you can tell the transaction to be "read-only" which in turn the JDBC driver can consider optimizing the query (but does not have to, so nobody will prevent you from issuing an INSERT nevertheless). E.g. the Oracle driver will completely avoid table locks on queries in a transaction marked read-only, which gains a lot of performance on heavily read-driven applications.
Consider nested transactions.
Most RDBMSes do not support nested transactions, or try to emulate them in a very limited way.
For example, in MS SQL Server, a rollback in an inner transaction (which is not a real transaction, MS SQL Server just counts transaction levels!) will rollback the everything which has happened in the outmost transaction (which is the real transaction).
Some database wrappers might consider a rollback in an inner transaction as an sign that an error has occured and rollback everything in the outmost transaction, regardless whether the outmost transaction commited or rolled back.
So a COMMIT is the safe way, when you cannot rule out that your component is used by some software module.
Please note that this is a general answer to the question. The code example cleverly works around the issue with an outer transaction by opening a new database connection.
Regarding performance: depending on the isolation level, SELECTs may require a varying degree of LOCKs and temporary data (snapshots). This is cleaned up when the transaction is closed. It does not matter whether this is done via COMMIT or ROLLBACK. There might be a insignificant difference in CPU time spent - a COMMIT is probably faster to parse than a ROLLBACK (two characters less) and other minor differences. Obviously, this is only true for read-only operations!
Totally not asked for: another programmer who might get to read the code might assume that a ROLLBACK implies an error condition.
внутренняя структура приложения, которую мы используем в моей компании, делает необходимым поместить каждый SQL-запрос в транзакции, даже если я знаю, что ни одна из команд не внесет изменений в базу данных. В конце сеанса, перед закрытием соединения, я фиксирую транзакцию, чтобы закрыть ее должным образом. Интересно, есть ли какая-то разница, если я откатил его назад, особенно с точки зрения скорости.
обратите внимание, что я использую Oracle, но я думаю, что другие базы данных имейте подобное поведение. Кроме того, я ничего не могу сделать с требованием начать транзакцию, эта часть кодовой базы находится вне моих рук.
базы данных часто сохраняют либо журнал до изображения (что это было до транзакции), либо журнал после изображения (что это будет, когда транзакция завершится.) Если он сохраняет перед-образ, который должен быть восстановлен при откате. Если он сохраняет after-image, это должно заменить данные в случае фиксации.
Oracle имеет как журнал, так и пространство отката. Журнал транзакций накапливает блоки, которые позже записываются авторами БД. Поскольку эти asychronous, почти ничего связанного с DB writer не влияет на вашу транзакцию (если очередь заполняется, вам, возможно, придется подождать.)
даже для транзакции только для запросов я готов поспорить, что в областях отката Oracle есть немного транзакционного учета. Я подозреваю, что откат требует некоторой работы со стороны Oracle, прежде чем он определит, что на самом деле нечего откатывать. И я думаю, что это синхронно с вашей транзакцией. Вы можете не отпустите все блокировки до завершения отката. [Да, я знаю, что вы не используете их в своей транзакции, но проблема блокировки заключается в том, почему я думаю, что откат должен быть полностью освобожден, тогда все замки могут быть освобождены, тогда ваш откат завершен.]
с другой стороны, фиксация является более или менее ожидаемым результатом, и я подозреваю, что отбрасывание области отката может быть немного быстрее. Вы не создали никаких записей транзакций, поэтому DB writer никогда не проснется, чтобы проверить и обнаружить, что делать было нечего.
Я также ожидаю, что, хотя фиксация может быть быстрее, различия будут незначительными. Настолько незначительные, что вы не сможете даже измерить их в параллельном сравнении.
Я согласен с предыдущими ответами, что в этом случае нет разницы между фиксацией и откатом. Возможно, существует незначительная разница во времени процессора, необходимого для определения того, что нечего фиксировать, по сравнению с временем процессора, необходимым для определения того, что нечего откатывать. Но, если это незначительная разница, мы можем спокойно забыть об этом.
однако стоит отметить, что существует разница между сеансом, который выполняет кучу запросов в контекст одной транзакции и сеанса, который выполняет одни и те же запросы в контексте серии транзакций.
Если клиент запускает транзакцию, выполняет запрос, выполняет откат фиксатора, затем запускает вторую транзакцию и выполняет второй запрос, нет никакой гарантии, что второй запрос будет наблюдать то же состояние базы данных, что и первый запрос. Иногда поддержание единого согласованного представления данных имеет важное значение. Иногда, получать больше течения представление данных имеет существенное значение. Это зависит от того, что вы делаете.
хотя я использую Git довольно часто, я все еще новичок.
иногда я делаю ошибку, но замечаю ее только после Я совершил это. В этот момент мне обычно приходится долго искать в Интернете команду, которую я должен использовать, чтобы избавиться от нее (перед тем, как нажать).
каждый раз, когда это происходит, я задаюсь вопросом, в чем разница между четырьмя терминами, которые я обычно прихожу поперек:
- вернуться
- изменить
- откат
- отменить.
У меня есть, что наконец-то пришло время узнать эти различия раз и навсегда. Каковы они?
условия вернуться и изменить имеют хорошо определенное значение в Git. В отличие от этого, откат и отменить не имеют такого четко определенного значения и открыты для интерпретации.
отменить коммит.
. может означать в зависимости от контекста, либо вернуться или изменить фиксации.
git --amend Вы должны использовать команду git --amend только для коммитов, которые не были переданы в общедоступную ветвь другого репозитория Git. Команда git --amend создает новый идентификатор фиксации, и люди могут основывать свою работу уже на существующей фиксации. В этом случае им нужно будет перенести свою работу на основе нового commit
git revert Вы можете отменить коммиты с помощью команды git revert. Эта команда отменяет изменения совершать. Такие фиксации полезны для документирования того, что изменение было отозвано.
здесь [Введите описание ссылки здесь][1]
Отмена Изменений: git checkout , git revert , git reset , git clean
-
git revert : эта команда отменяет изменения фиксации. он ведет учет в журналах.
git reset : эта команда отменяет изменения фиксации. он не поддерживает запись в журналах, т. е. сбрасывается на отмененную фиксацию. Примечание: это разрушительная функция. используйте эту команду осторожно.
- git reset --soft HEAD^ Отменить последнюю фиксацию, внести изменения в staging
- git reset --hard HEAD^ отменить последнюю фиксацию и все изменения
- git reset --hard HEAD^^ отменить последние 2 коммита и все изменения
git commit --amend где изменить означает добавить к последнему коммиту. Иногда мы забывали добавить файлы для фиксации. например АБВ.txt файл был забыт, мы можем добавить следующее: git add abc.txt и git commit --amend -m "New commit message"
Oracle поддерживает очень мощную и надежную модель транзакций. Код приложения определяет логическую последовательность выполняемых операций, результаты которой должны быть либо сохранены командой COMMIT , либо отменены командой ROLLBACK.
Транзакция начинается неявно с первой команды SQL , выполняемой после команды COMMIT или ROLLBACK (или с начала сеанса) или же после команды ROLLBACK TO SAVEPOINT . Для управления транзакциями PL/SQL предоставляет набор команд:
- COMMIT — сохраняет (фиксирует) все изменения, внесенные со времени выполнения последней команды COMMIT или ROLLBACK , и снимает все блокировки.
- ROLLBACK — отменяет (откатывает) все изменения, внесенные со времени выполнения последней команды COMMIT или ROLLBACK , и снимает все блокировки.
- ROLLBACK TO SAVEPOINT — отменяет все изменения со времени установки последней точки сохранения и снимает все блокировки, установленные в этой части кода.
- SAVEPOINT — устанавливает точку сохранения, после чего становится возможным частичный откат транзакции.
- SET TRANSACTION — позволяет начать сеанс чтения или чтения-записи, установить уровень изоляции или связать текущую транзакцию с заданным сегментом отката.
- LOCK TABLE — позволяет заблокировать всю таблицу в указанном режиме. (По умолчанию к таблице обычно применяется блокировка на уровне строк.)
Эти команды более подробно рассматриваются в следующих разделах блога.
Свойства автономных транзакций
- Автономная транзакция может быть указана на уровне подпрограммы.
- Чтобы любая подпрограмма работала в другой транзакции, в декларативном разделе этого блока должно быть указано ключевое слово « PRAGMA AUTONOMOUS_TRANSATION ».
- Оно даст указание компилятору обрабатывать это как отдельную транзакцию, и сохранение / отмена внутри этого блока не будет отражаться в основной транзакции.
- Перед выходом из этой автономной транзакции в основную транзакцию необходимо выполнить COMMIT или ROLLBACK , поскольку в любой момент может быть активна только одна транзакция.
- Поэтому, как только мы сделали автономную транзакцию, нам нужно сохранить ее и завершить транзакцию, тогда только мы можем вернуться к основной транзакции сеанса.
Команда LOCK TABLE
Команда блокирует всю таблицу базы данных в указанном режиме. Блокировка запрещает или разрешает модификацию данных таблицы со стороны других транзакций на то время, пока вы с ней работаете. Синтаксис команды LOCK TABLE :
LOCK TABLE список_таблиц IN режим_блокировки MODE [NOWAIT];
Здесь список таблиц — список из одной или нескольких таблиц (локальных таблиц/пред- ставлений или доступных через удаленное подключение), а режим блокировки — один из шести режимов: ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE.
Если команда содержит ключевое слово NOWAIT , база данных не ждет снятия блокировки в том случае, если нужная таблица заблокирована другим пользователем, и выдает сообщение об ошибке. Если ключевое слово NOWAIT не указано, Oracle ждет освобождения таблицы в течение неограниченно долгого времени. Блокировка таблицы не мешает другим пользователям считывать из нее данные.
Примеры допустимых команд LOCK TABLE :
Там, где это возможно, используйте стандартные средства блокировки Oracle . Команду LOCK TABLE в приложениях следует использовать только в крайних случаях и с величайшей осторожностью.
Что такое TCL-операторы в PL / SQL?
Операторы TCL означает используются для контроля транзакций в базе данных Oracle. Такой оператор либо сохранит ожидающие транзакции ( Commit ), либо откатит ожидающую транзакцию ( Rollback ). Эти операторы играют жизненно важную роль, потому что, если транзакция не сохранена, изменения через операторы DML не будут сохранены в базе данных. Ниже приведены различные операторы TCL.
Сохраняет все ожидающие (pending) транзакции
Отменяет все ожидающие транзакции
Создает контрольную точку в транзакции, до которой откат может быть выполнен позже
Отменить все ожидающие транзакции до указанной ( )
Транзакция будет завершена в следующих сценариях.
- Когда выдается какое-либо из вышеуказанных утверждений (кроме SAVEPOINT )
- Когда выдаются заявления DDL. (DDL - операторы автоматической фиксации)
- Когда выдаются заявления DCL. (DCL - операторы автоматической фиксации)
Что такое автономная транзакция
В PL / SQL все изменения, сделанные в данных, будут называться транзакцией. Транзакция считается завершенной, когда к ней применено сохранение ( Commit ) / сброс ( Rollback ). Если сохранение / удаление не задано, транзакция не будет считаться завершенной, и изменения, внесенные в данные, не будут выполнены на сервере на постоянной основе (не будут зафиксированными в базе).
Независимо от некоторых модификаций, выполненных во время сеанса, PL / SQL будет рассматривать всю модификацию как одну транзакцию, а сохранение / отмена этой транзакции влияет на все ожидающие изменения в этом сеансе. Автономная транзакция предоставляет функциональность разработчику, в которой она позволяет вносить изменения в отдельную транзакцию и сохранять / отменять эту конкретную транзакцию, не затрагивая основную транзакцию сеанса.
возвращаясь фиксации.
. означает создание (в текущей ветви) новой фиксации, которая применяет обратные изменения, введенные другой фиксацией. Это предпочтительный подход для исправления проблемы в РЕПО, которая имеет уже поделился с другими, потому что это не связано с каким-либо разрушением (т. е. переписыванием истории).
чтобы отменить фиксацию выявленных , просто запустите
Команда ROLLBACK
Команда ROLLBACK отменяет (полностью или частично) изменения, внесенные в базу данных в текущей транзакции. Для чего это может потребоваться? Например, для исправления ошибок:
«Нет, Нет! Я хотел удалить только те заказы, которые были сделаны до мая 2005 года!» Нет проблем — достаточно выполнить команду ROLLBACK. Что касается программирования приложений, в случае возникновения проблем откат позволяет вернуться к исходному состоянию.
Синтаксис команды ROLLBACK :
Существует две основные разновидности ROLLBACK : без параметров и с секцией TO, указывающей, до какой точки сохранения следует произвести откат. Первая отменяет все изменения, выполненные в ходе текущей транзакции, а вторая отменяет все изменения и снимает все блокировки, установленные после заданной точки сохранения. (О том, как установить в приложении точку сохранения, рассказано в следующем разделе.) Имя точки сохранения представляет собой необъявленный идентификатор Oracle . Это не может быть литерал (заключенный в кавычки) или имя переменной.
Все команды ROLLBACK в следующем фрагменте действительны :
При откате до заданной точки сохранения все установленные после нее точки стираются, но данная точка остается. Это означает, что можно возобновить с нее транзакцию и при необходимости снова вернуться к этой же точке сохранения.
Непосредственно перед выполнением команды INSERT , UPDATE , MERGE или DELETE PL/SQL автоматически устанавливает неявную точку сохранения, и если команда завершается ошибкой, выполняется автоматический откат до этой точки. Если в дальнейшем в ходе выполнения команды DML происходит сбой, выполняется автоматический откат до этой точки. Подобным образом отменяется только последняя команда DML .
Примеры кода PL/SQL с автономной транзакцией
В этом примере мы собираемся понять, как работает автономная транзакция. Блоки основной и автономной транзакции приведены на рисунке ниже:
Результат выполнения кода:
Объяснение кода:
Строка 2: объявление l_salary как NUMBER .
Строка 3: объявление процедуры nested_block
Строка 4: Создание процедуры nested_block как « AUTONOMOUS_TRANSACTION »
Строки 7-9: повышение зарплаты сотруднику с номером 1002 на 15000.
Строка 10: фиксация транзакции
Строки 13-16: печать сведений о зарплате сотрудника 1001 и 1002 до внесения изменений
Строки 17-19: повышение зарплаты сотруднику № 1001 на 5000
Строки 20: вызов процедуры nested_block
Строки 21: отмена основной транзакции
Строки 22-25: печать сведений о зарплате сотрудника 1001 и 1002 после изменений.
Увеличение зарплаты сотруднику с номером 1001 не отразится в результате, поскольку основная транзакция была отклонена. Увеличение заработной платы сотрудника с номером 1002 отражено, поскольку этот блок был выполнен как отдельная (автономная) транзакция и сохранен в конце.
Таким образом, независимо от сохранения / отмены в основной транзакции, изменения в автономной транзакции были сохранены без изменения основных транзакций.
Команда SET TRANSACTION
Команда SET TRANSACTION позволяет начать сеанс чтения или чтения-записи, установить уровень изоляции или связать текущую транзакцию с заданным сегментом отката. Эта команда должна быть первой командой SQL транзакции и дважды использоваться в ходе одной транзакции не может. У нее имеются четыре разновидности.
- SET TRANSACTION READ ONLY — определяет текущую транзакцию доступной «только для чтения». В транзакциях этого типа всем запросам доступны лишь те изменения, которые были зафиксированы до начала транзакции. Они применяются, в частности, в медленно формируемых отчетах со множеством запросов, благодаря чему в них часто используются строго согласованные данные.
- SET TRANSACTION READ WRITE — определяет текущую транзакцию как операцию чтения и записи данных в таблицу.
- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE | READ COMMITTED — определяет способ выполнения транзакции, модифицирующей базу данных. С ее помощью можно задать один из двух уровней изоляции транзакции: SERIALIZABLE или READ COMMITTED . В первом случае команде DML , пытающейся модифицировать таблицу, которая уже изменена незафиксированной транзакцией, будет отказано в этой операции. Для выполнения этой команды в инициализационном параметре COMPATIBLE базы данных должна быть задана версия 7.3.0 и выше.При установке уровня READ COMMITED команда DML , которой требуется доступ к строке, заблокированной другой транзакцией, будет ждать снятия этой блокировки.
- SET TRANSACTION USE ROLLBACK SEGMENT имя сегмента — назначает текущей транзакции заданный сегмент отката и определяет ей доступ «только для чтения». Не может использоваться совместно с командой SET TRANSACTION READ ONLY .
Механизм сегментов отката считается устаревшим; вместо него следует использовать средства автоматического управления отменой, введенные в Oracle9i.
изменение фиксации.
. означает замену" текущей " фиксации на новую, которая имеет тот же родитель(ы); подробнее в как именно git commit --amend работает?
имейте в виду, что
-
О внесении изменений фиксация, которую вы уже нажали на общий пульт, - плохая практика, потому что это форма перезаписи истории (она "удаляет" самую последнюю фиксацию, на которой ваши сотрудники, возможно, уже основывали свою работу);
вы можете изменить только последний коммит в данной ветви; чтобы переписать старые коммиты, вам нужно вывести big guns (например, interactive rebase).
чтобы изменить фиксацию, внесите все необходимые изменения и выполните их, затем запустить
Читайте также: