--Транзакция - единица работы
--При успешном выполнении все модификации данных, сделанные в течение транзакции, принимаются и становятся постоянной частью базы данных.
--При возникновении ошибки должна быть произведена отмена или выполнен откат, все модификации данных будут отменены
--Явные транзакции
--Каждая транзакция явно начинается с инструкции BEGIN TRANSACTION и явно заканчивается инструкцией COMMIT или ROLLBACK
--Неявные транзакции
--Новая транзакция неявно начинается, когда предыдущая транзакция завершена, но каждая транзакция явно завершается инструкцией COMMIT или ROLLBACK
--Свойства транзакций:
--Атомарность - Либо все операции транзакции завершаются успешно, либо ни одна операция из них не выполняется.
--Согласованность - Ресурсы, вовлеченные транзакцией, остаются в согласованном состоянии в начале транзакции и при ее окончании.
--Транзакция не должна нарушать ограничения, накладываемые требованием целостности.
--Изолированность - Операции транзакции являются изолированными для остальных операций.
--Внешние по отношению к транзакции операции ничего не занют о данных внутри самой транзакции.
--Устойчивость - После успешного завершении транзакции ее результаты фиксируются, в случае прерывания или сбоя - откатываются.
--BEGIN TRANSACTION - начальная точка явной транзакции
--COMMIT TRANSACTION - отмечает успешное завершение явной или неявной транзакции в значении @@TRANCOUNT равным 1(успех)
--SAVE TRANSACTION - устанавливает точку сохранения внутри транзакции
--ROLLBACK TRANSACTION - отмена транзакции до начала или до точки сохранения транзакции
--Начинаем транзакцию
BEGIN TRAN;
UPDATE dbo.peoples SET age = 1;
--Первая точка сохранения
SAVE TRAN save_point_1;
UPDATE dbo.peoples SET age = 2;
--Вторая точка сохранения
SAVE TRAN save_point_2;
--Откатываемся к первой точке сохранения
ROLLBACK TRAN save_point_1;
--Подтверждаем окончание транзакции
COMMIT TRAN;
SELECT * FROM dbo.peoples;
--Пример транзакции с откатом в случае ошибки
BEGIN TRANSACTION;
BEGIN TRY --Вызовем ошибку
UPDATE dbo.peoples SET age = 'Error';
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
SELECT * FROM dbo.peoples
--Change Tracking
--К сожалению у меня Express Edition, показать не смогу, но пример запроса просмотра изменений - рабочий
--Включить в свойствах базы
--Свойства - отслеживание изменений - отслеживание изменений - True
--CT (Change Tracking)
--CDC (Change Data Capture)
--Столбец "is_cdc_enabled" - показывает, где включен Change Tracking
USE master
GO
SELECT
database_id,
name,
is_cdc_enabled
FROM sys.databases
GO
USE test;
GO --Включает систему отслеживания измененных данных для текущей базы данных
EXECUTE sys.sp_cdc_enable_db;
GO --Отключает систему отслеживания измененных данных в текущей базе данных
EXECUTE sys.sp_cdc_disable_db
--Активирует систему отслеживания измененных данных в указанной исходной таблице текущей базы данных
--@source_schema - имя схемы, к которой относится исходная таблица
--@source_name- имя исходной таблицы, из которой требуется включить систему отслеживания измененных данных
--@role_name - имя роли базы данных, которая использовалась для доступа к данным изменений
--https://msdn.microsoft.com/ru-ru/library/bb522475(v=sql.120).aspx
EXECUTE sys.sp_cdc_enable_table
@source_schema = N'dbo'
, @source_name = N'peoples'
, @role_name = N'cdc_admin';
GO