Transaction sql: BEGIN TRANSACTION (Transact-SQL) — SQL Server

Команда SQL SET TRANSACTION, COMMIT, ROLLBACK, SAVEPOINT в Oracle

В Oracle пользователю разрешается выполнять несколько операторов изменения данных как одну логическую единицу работы, заканчиваемую или сохранением результатов в базе данных, или их отменой. Транзакция начинается с первого исполняемого SQL-оператора пользователя и заканчивается явной фиксацией (завершением) или откатом со стороны пользователя.

Транзакции обрабатываются группой управляющих средств, с помощью которых пользователь может выдать команду INSERT, UPDATE или DELETE, указывающую начало серии команд изменения данных. После внесения изменений в базу данных пользователь может сохранить данные в базе, закончив транзакцию явным образом. Если же в любой момент транзакции возникает ошибка, пользователь может отменить изменения в базе данных, возвратив ее в состояние, в котором она находилась до начала транзакции. Транзакции создаются посредством  двух различных элементов базы данных Oracle. Первый – это набор команд, определяющий начало, контрольные точки и окончание транзакции, а второй – специальный механизм блокирования, предотвращающий изменение информации строк базы данных несколькими пользователями одновременно.

Транзакции описываются следующими командами:

  • SET TRANSACTION – начинает транзакцию и устанавливает ее базовые характеристики.
  • COMMIT – заканчивает текущую транзакцию сохранением изменений в базе данных и начинает новую транзакцию
  • ROLLBACK – заканчивает текущую транзакцию отменой изменений в базе данных и начинает новую транзакцию
  • SAVEPOINT – устанавливает контрольные точки (точки прерывания) для транзакции, разрешая неполный откат.

Команда SET TRANSACTION является необязательной, так как транзакция начинается:

  • после регистрации пользователя в Oracle с помощью SQL*Plus и исполнения им первой команды
  • после выдачи команды ROLLBACK или COMMIT, заканчивающей транзакцию
  • после выхода пользователя из системы
  • в результате аварии системы
  • после выдачи команды описания данными, например ALTER DATABASE

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

Выдачей команды COMMIT в базе данных еще и неявно закрывается текущая транзакция и начинается новая. Откат транзакции выполняется не только в результате выдачи команды ROLLBACK, но и неявно, когда выполнение оператора по той или иной причине заканчивается неудачно или когда пользователь отменяет оператор командой CTRL-C.

Установка контрольных точек с помощью команды SAVEPOINT позволяет разбить весь объем работы, выполняемой транзакцией, на отдельные сегменты. Откат можно производить только до конкретной точки сохранения, оставляя предшествующие изменения в силе. Точки сохранения очень полезны в ситуациях, когда необходимо восстановить часть незавершенной транзакции.

Следующий пример показывает, что в программном блоке сохраняются только те изменения, которые были внесены до описания точки сохранения:

UPDATE my_table.products SET price=50 WHERE product=10010; SAVEPOINT точка_сохранения;
UPDATE my_table. products SET price=200; ROLLBACK TO SAVEPOINT точка_сохранения; COMMIT;

Руководство по SQL. Транзакции. – PROSELYTE

Транзакция является рабочей единицей работы с базой данных (далее – БД). Это последовательность операций, выполняемых в логическом порядке пользователем, либо программой, которая работает с БД.

Мы можем сказать, что транзакция – это распространение изменений в БД. Например, если мы создаём, изменяем или удаляем запись, то мы выполняем транзакцию. Крайне важно контролировать транзакции для гарантирования.

Основные концепции транзакции описываются аббревиатурой ACID – Atomicity, Consistency, Isolation, Durability (Атомарность, Согласованность, Изолированность, Долговечность).


Атомарность

Атомарность гарантирует, что любая транзакция будет зафиксирована только целиком (полностью). Если одна из операций в последовательности не будет выполнена, то вся транзакция будет отменена. Тут вводится понятие “отката” (rollback). Т.е. внутри последовательности будут происходить определённые изменения, но по итогу все они будут отменены (“откачены”) и по итогу пользователь не увидит никаких изменений.


Согласованность

Это означает, что любая завершённая транзакция (транзакция, которая достигла завершения транзакции – end of transaction) фиксирует только допустимые результаты. Например, при переводе денег с одного счёта на другой, в случае, если деньги ушли с одного счёта, они должны прийти на другой (это и есть согласованность системы). Списание и зачисление  – это две разные транзакции, поэтому первая транзакция пройдёт без ошибок, а второй просто не будет. Именно поэтому крайне важно учитывать это свойство и поддерживать баланс системы.


Изолированность

Каждая транзакция должна быть изолирована от других, т.е. её результат не должен зависеть от выполнения других параллельных транзакций. На практике, изолированность крайне труднодостижимая вещь, поэтому здесь вводится понятие “уровни изолированности” (транзакция изолируется не полностью).


Долговечность

Эта концепция гарантирует, что если мы получили подтверждение о выполнении транзакции, то изменения, вызванные этой транзакцией не должны быть отменены из-за сбоя системы (например, отключение электропитания).


Управление транзакциями

Для управления транзакциями используются следующие команды:

  • COMMIT
    Сохраняет изменения
  • ROLLBACK
    Откатывает (отменяет) изменения
  • SAVEPOINT
    Создаёт точку к которой группа транзакций может откатиться
  • SET TRANSACTION
    Размещает имя транзакции.

Команды управление транзакциями используются только для DML команд: INSERT, UPDATE, DELETE. Они не могут быть использованы во время создания, изменения или удаления таблицы.

Примеры:
Перед началом выполните следующую команду, для того, чтобы отключить автоматическое выполнение транзакции:

mysql> SET autocommit=0;

Предположим, что у нас есть таблица developers, которая содержит следующие записи:

+----+-------------------+-----------+------------+--------+
| ID | NAME              | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+-----------+------------+--------+
|  1 | Eugene Suleimanov | Java      |          2 |   2500 |
|  2 | Peter Romanenko   | Java      |          3 |   3500 |
|  3 | Andrei Komarov    | C++       |          3 |   2500 |
|  4 | Konstantin Geiko  | C#        |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX     |          2 |   1800 |
|  7 | Ivan Ivanov       | C#        |          1 |    900 |
|  8 | Ludmila Geiko     | UI/UX     |          2 |   1800 |
+----+-------------------+-----------+------------+--------+

Удалим всех С++ разработчиков с помощью следующей команды:

mysql> DELETE FROM developers 
       WHERE SPECIALTY = 'C++';
mysql> COMMIT;

В результате выполнения данного запроса наша таблица будет содержать следующие записи:

+----+-------------------+-----------+------------+--------+
| ID | NAME              | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+-----------+------------+--------+
|  1 | Eugene Suleimanov | Java      |          2 |   2500 |
|  2 | Peter Romanenko   | Java      |          3 |   3500 |
|  4 | Konstantin Geiko  | C#        |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX     |          2 |   1800 |
|  7 | Ivan Ivanov       | C#        |          1 |    900 |
|  8 | Ludmila Geiko     | UI/UX     |          2 |   1800 |
+----+-------------------+-----------+------------+--------+

Теперь попробуем выполнить команду ROLLBACK:

mysql> ROLLBACK;

После выполнения данной команды наша таблица содержит следующие данные:

+----+-------------------+-----------+------------+--------+
| ID | NAME              | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+-----------+------------+--------+
|  1 | Eugene Suleimanov | Java      |          2 |   2500 |
|  2 | Peter Romanenko   | Java      |          3 |   3500 |
|  3 | Andrei Komarov    | C++       |          3 |   2500 |
|  4 | Konstantin Geiko  | C#        |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX     |          2 |   1800 |
|  6 | Ludmila Geiko     | UI/UX     |          2 |   1800 |
|  7 | Ivan Ivanov       | C#        |          1 |    900 |
+----+-------------------+-----------+------------+--------+

Как мы видим, запись С++ разработчика вновь в таблице.

Теперь постараемся разобраться с SAVEPOINT.
Для начала создадим точку сохранения, используя следующий запрос:

mysql> SAVEPOINT SP1;

Теперь выполним следующие запросы:

mysql> DELETE FROM developers WHERE ID = 7;
Query OK, 1 row affected (0.00 sec)
mysql> DELETE FROM developers WHERE ID = 6;
Query OK, 1 row affected (0.02 sec)
mysql> DELETE FROM developers WHERE ID = 5;
Query OK, 1 row affected (0.00 sec)

На данный момент наша таблица содержит следующие записи:

+----+-------------------+-----------+------------+--------+
| ID | NAME              | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+-----------+------------+--------+
|  1 | Eugene Suleimanov | Java      |          2 |   2500 |
|  2 | Peter Romanenko   | Java      |          3 |   3500 |
|  3 | Andrei Komarov    | C++       |          3 |   2500 |
|  4 | Konstantin Geiko  | C#        |          2 |   2000 |
+----+-------------------+-----------+------------+--------+

Теперь мы вернёмся к точке сохранения SP1 с помощью команды:

mysql> ROLLBACK TO SP1;

После выполнения данного запроса, наша таблица будет хранить следующие записи:

+----+-------------------+-----------+------------+--------+
| ID | NAME              | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+-----------+------------+--------+
|  1 | Eugene Suleimanov | Java      |          2 |   2500 |
|  2 | Peter Romanenko   | Java      |          3 |   3500 |
|  3 | Andrei Komarov    | C++       |          3 |   2500 |
|  4 | Konstantin Geiko  | C#        |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX     |          2 |   1800 |
|  6 | Ludmila Geiko     | UI/UX     |          2 |   1800 |
|  7 | Ivan Ivanov       | C#        |          1 |    900 |
+----+-------------------+-----------+------------+--------+

Как мы видим, мы откатились к состоянию таблицы на момент создания точки сохранения SP1.

Теперь, когда нам больше не нужна данная точка сохранения, мы можем её освободить:

mysql> RELEASE SAVEPOINT SP1;

В завершение мы рассмотрим команду SET TRANSACTION, которая используется для того, чтобы инициировать транзакцию БД. Данная команда, позволяет нам определить характеристики транзакции.
Например, если мы хотим, указать, что транзакция предназначена только для чтения, то мы должны использовать следующий запрос:

SET TRANSACTION READ ONLY;

Если же мы хотим, чтобы транзакция позволяла выполнять запись данных, то запрос будет иметь вид, указанный ниже:

SET TRANSACTION READ WRITE;

На этом мы заканчиваем изучение SQL транзакций.
В следующей статье мы рассмотрим функции даты.

транзакций (Transact-SQL) — SQL Server

Редактировать

Твиттер

LinkedIn

Фейсбук

Эл. адрес

  • Статья
  • 2 минуты на чтение

Применимо к:
SQL Server (все поддерживаемые версии)
База данных SQL Azure
Управляемый экземпляр Azure SQL
Аналитика синапсов Azure
Система аналитической платформы (PDW)

Транзакция — это отдельная единица работы. Если транзакция прошла успешно, все изменения данных, сделанные во время транзакции, фиксируются и становятся постоянной частью базы данных. Если транзакция обнаруживает ошибки и должна быть отменена или отменена, все изменения данных стираются.

SQL Server работает в следующих режимах транзакций:

Автофиксация транзакций
Каждый отдельный оператор является транзакцией.

Явные транзакции
Каждая транзакция явно начинается с оператора BEGIN TRANSACTION и явно завершается с помощью оператора COMMIT или ROLLBACK.

Неявные транзакции
Новая транзакция неявно запускается после завершения предыдущей транзакции, но каждая транзакция явно завершается оператором COMMIT или ROLLBACK.

Транзакции с пакетной областью действия
Применимо только к нескольким активным наборам результатов (MARS). Явная или неявная транзакция Transact-SQL, которая начинается в рамках сеанса MARS, становится пакетной транзакцией. Транзакция с областью действия пакета, которая не зафиксирована или не отменена после завершения пакета, автоматически откатывается SQL Server.

Примечание

Особые замечания, связанные с продуктами хранилища данных, см. в разделе Транзакции (Azure Synapse Analytics).

В этом разделе

SQL Server предоставляет следующие операторы транзакций:

НАЧАТЬ РАСПРЕДЕЛЕННУЮ ТРАНЗАКЦИЮ

ОТМЕНА ТРАНЗАКЦИИ

НАЧАТЬ ТРАНЗАКЦИЮ

ОБРАТНАЯ РАБОТА

СОВЕРШИТЬ ТРАНЗАКЦИЮ

СОХРАНИТЬ ТРАНЗАКЦИЮ

ЗАВЕРШИТЬ РАБОТУ

См. также

SET IMPLICIT_TRANSACTIONS (Transact-SQL)
@@TRANCOUNT (Transact-SQL)

SQL | ТРАНЗАКЦИИ — GeeksforGeeks

Что такое транзакции?

Транзакции группируют набор задач в единую исполнительную единицу. Каждая транзакция начинается с определенной задачи и заканчивается, когда все задачи в группе успешно завершены. Если какая-либо из задач завершается неудачей, транзакция завершается неудачно. Поэтому транзакция имеет только два результата: успех или сбой .
Пример транзакции по переводу 150 долларов со счета A на счет B:
1. чтение(A)
2. A := A – 150
3. запись(A)
4. чтение(B)
5. B : = B + 150
6. write(B)

Незавершенные шаги приводят к сбою транзакции. Транзакция базы данных по определению должна быть атомарной, согласованной, изолированной и надежной.
 В народе они известны как свойства ACID. Эти свойства могут обеспечить одновременное выполнение нескольких транзакций без конфликтов.

Как реализовать транзакции с помощью SQL?

Следующие команды используются для управления транзакциями. Важно отметить, что эти операторы нельзя использовать при создании таблиц и они используются только с командами DML, такими как – INSERT, UPDATE и DELETE.
 

1. НАЧАТЬ ТРАНЗАКЦИЮ: Указывает начальную точку явной или локальной транзакции.

Синтаксис:

 НАЧАТЬ ТРАНЗАКЦИЮ имя_транзакции ; 

2. SET TRANSACTION:  Назначает имя транзакции.

Синтаксис:  

 SET TRANSACTION [ READ WRITE | ТОЛЬКО ЧТЕНИЕ]; 

3. COMMIT: Если со всеми операторами в рамках одной транзакции все в порядке, то все изменения записываются вместе в базу данных с именем commit . Команда COMMIT сохраняет в базе данных все транзакции с момента последней команды COMMIT или ROLLBACK.
 

Синтаксис:  
 

 COMMIT; 

Пример: Образец таблицы 1  

 

Ниже приведен пример, который удалит из таблицы те записи, возраст которых = 20, а затем зафиксирует изменения в базе данных.
Запросы:  
 

 УДАЛИТЬ ИЗ УЧЕНИК, ГДЕ ВОЗРАСТ = 20;
СОВЕРШИТЬ; 

Вывод:  
Таким образом, две строки из таблицы будут удалены, а оператор SELECT будет выглядеть так: 

 

4. ОТМЕНА: Если возникает какая-либо ошибка с любым из сгруппированных операторов SQL, все изменения необходимо отменить. Процесс отмены изменений называется rollback . Эту команду можно использовать только для отмены транзакций с момента выполнения последней команды COMMIT или ROLLBACK.
Синтаксис:  
 

 ROLLBACK; 

Пример:  
Из приведенного выше примера Sample table1
Удалите из таблицы те записи, возраст которых = 20, а затем ОТМЕНИТЕ изменения в базе данных.
Запросы:  
 

 УДАЛИТЬ ИЗ УЧЕНИК, ГДЕ ВОЗРАСТ = 20;
ОТКАТ; 

Вывод:  

 

5. ТОЧКА СОХРАНЕНИЯ: создает точки в группах транзакций, в которых выполняется ОТМЕНА.
ТОЧКА СОХРАНЕНИЯ — это точка в транзакции, в которой вы можете откатить транзакцию до определенной точки, не откатывая всю транзакцию.
 

Синтаксис команды точки сохранения:  
 

 ТОЧКА СОХРАНЕНИЯ ИМЯ_ТОЧКИ СОХРАНЕНИЯ; 

Эта команда используется только при создании SAVEPOINT среди всех транзакций.
Обычно ROLLBACK используется для отмены группы транзакций.
Синтаксис команды отката к точке сохранения:  
 

 ROLLBACK TO SAVEPOINT_NAME; 

вы можете в любой момент ОБРАТИТЬСЯ к любой ТОЧКЕ СОХРАНЕНИЯ, чтобы вернуть соответствующие данные в исходное состояние.
Пример:  
Из приведенного выше примера Образец таблицы1
Удалите из таблицы те записи, у которых возраст = 20, а затем ОТМЕНИТЕ изменения в базе данных, сохранив точки сохранения.
Запросы:  
 

 ТОЧКА СОХРАНЕНИЯ SP1;
//Точка сохранения создана.
УДАЛИТЬ ОТ Student WHERE AGE = 20;
//удалено
ТОЧКА СОХРАНЕНИЯ SP2;
//Точка сохранения создана. 

Здесь SP1 — это первая ТОЧКА СОХРАНЕНИЯ, созданная перед удалением.