Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureБаза данных SQL в Microsoft Fabric
Устанавливает точку сохранения внутри транзакции.
Соглашения о синтаксисе Transact-SQL
Syntax
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Arguments
savepoint_name
Имя, назначенное точке сохранения. Имена точек сохранения должны соответствовать правилам для идентификаторов, но ограничены 32 символами. savepoint_name всегда учитывает регистр, даже если экземпляр ядра СУБД не учитывает регистр.
@savepoint_variable
Имя определяемой пользователем переменной, содержащей допустимое имя точки сохранения. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar. В переменную можно передать более 32 символов, но используются только первые 32 символа.
Remarks
Вы можете задать точку сохранения в транзакции. Точка сохранения определяет состояние согласованности, к которому транзакция может возвращать, если часть транзакции условно отменена. Если транзакция откатывается в точку сохранения, она должна перейти к завершению с дополнительными Transact-SQL операторами при необходимости и COMMIT TRANSACTION оператором или полностью отменить, откатив транзакцию обратно к началу. Чтобы отменить всю транзакцию, используйте форму ROLLBACK TRANSACTION transaction_name. Отменяются все инструкции или процедуры транзакции.
Повторяющиеся имена точек сохранения разрешены в транзакции, но ROLLBACK TRANSACTION инструкция, указывающая имя точки сохранения, возвращает транзакцию только к последнему SAVE TRANSACTION с помощью этого имени.
SAVE TRANSACTION не поддерживается в распределенных транзакциях, запущенных явным образом BEGIN DISTRIBUTED TRANSACTION или повышено из локальной транзакции.
Замечание
Ядро СУБД не поддерживает независимо управляемые вложенные транзакции. Фиксация внутренних транзакций уменьшается @@TRANCOUNT , но не имеет других последствий. Откат внутренней транзакции всегда откатывает внешнюю транзакцию, если точка сохранения не существует и не указана в инструкции ROLLBACK .
Поведение блокировки
Инструкция ROLLBACK TRANSACTION , указывающая savepoint_name освобождает все блокировки, приобретенные за пределами точки сохранения, за исключением эскалации и преобразованных блокировок. Эти блокировки не выпускаются, и они не преобразуются обратно в предыдущий режим блокировки.
Permissions
Необходимо членство в роли public.
Examples
Примеры кода в этой статье используют базу данных образца AdventureWorks2025 или AdventureWorksDW2025, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.
В следующем примере показано, как использовать точку сохранения транзакций для отката только изменений, внесенных хранимой процедурой, если транзакция запущена перед выполнением хранимой процедуры.
IF EXISTS (SELECT name FROM sys.objects
WHERE name = N'SaveTranExample')
DROP PROCEDURE SaveTranExample;
GO
CREATE PROCEDURE SaveTranExample
@InputCandidateID INT
AS
-- Detect whether the procedure was called
-- from an active transaction and save
-- that for later use.
-- In the procedure, @TranCounter = 0
-- means there was no active transaction
-- and the procedure started one.
-- @TranCounter > 0 means an active
-- transaction was started before the
-- procedure was called.
DECLARE @TranCounter INT;
SET @TranCounter = @@TRANCOUNT;
IF @TranCounter > 0
-- Procedure called when there is
-- an active transaction.
-- Create a savepoint to be able
-- to roll back only the work done
-- in the procedure if there is an
-- error.
SAVE TRANSACTION ProcedureSave;
ELSE
-- Procedure must start its own
-- transaction.
BEGIN TRANSACTION;
-- Modify database.
BEGIN TRY
DELETE HumanResources.JobCandidate
WHERE JobCandidateID = @InputCandidateID;
-- Get here if no errors; must commit
-- any transaction started in the
-- procedure, but not commit a transaction
-- started before the transaction was called.
IF @TranCounter = 0
-- @TranCounter = 0 means no transaction was
-- started before the procedure was called.
-- The procedure must commit the transaction
-- it started.
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- An error occurred; must determine
-- which type of rollback will roll
-- back only the work done in the
-- procedure.
IF @TranCounter = 0
-- Transaction started in procedure.
-- Roll back complete transaction.
ROLLBACK TRANSACTION;
ELSE
-- Transaction started before procedure
-- called, do not roll back modifications
-- made before the procedure was called.
IF XACT_STATE() <> -1
-- If the transaction is still valid, just
-- roll back to the savepoint set at the
-- start of the stored procedure.
ROLLBACK TRANSACTION ProcedureSave;
-- If the transaction is uncommitable, a
-- rollback to the savepoint is not allowed
-- because the savepoint rollback writes to
-- the log. Just return to the caller, which
-- should roll back the outer transaction.
-- After the appropriate rollback, return error
-- information to the caller.
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE();
SELECT @ErrorSeverity = ERROR_SEVERITY();
SELECT @ErrorState = ERROR_STATE();
RAISERROR (
@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH
GO
Связанный контент
- НАЧАЛО ТРАНЗАКЦИИ (Transact-SQL)
- ЗАВЕРШЕНИЕ ТРАНЗАКЦИИ (Transact-SQL)
- ОБЯЗАТЕЛЬНАЯ РАБОТА (Transact-SQL)
- ERROR_LINE (Transact-SQL)
- ERROR_MESSAGE (Transact-SQL)
- ERROR_NUMBER (Transact-SQL)
- ERROR_PROCEDURE (Transact-SQL)
- ERROR_SEVERITY (Transact-SQL)
- ERROR_STATE (Transact-SQL)
- RAISERROR (Transact-SQL)
- ТРАНЗАКЦИЯ ОТКАТА (Transact-SQL)
- РАБОТА ПО ОТКАТУ (Transact-SQL)
- ПОПЫТКА... CATCH (Transact-SQL)
- XACT_STATE (Transact-SQL)
- Руководство по блокировке и управлению версиями строк транзакций