Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Database SQL di Microsoft Fabric
Mengatur titik penyimpanan dalam transaksi.
Syntax
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Arguments
savepoint_name
Adalah nama yang ditetapkan ke titik penyimpanan. Nama titik simpan harus sesuai dengan aturan untuk pengidentifikasi, tetapi dibatasi hingga 32 karakter. savepoint_name selalu peka huruf besar/kecil, bahkan ketika instans Mesin Database tidak peka huruf besar/kecil.
@savepoint_variable
Adalah nama variabel yang ditentukan pengguna yang berisi nama titik simpan yang valid. Variabel harus dideklarasikan dengan jenis data char, varchar, nchar, atau nvarchar . Lebih dari 32 karakter dapat diteruskan ke variabel, tetapi hanya 32 karakter pertama yang digunakan.
Remarks
Anda dapat mengatur titik penyimpanan dalam transaksi. Titik penyimpanan menentukan status konsistensi yang dapat dikembalikan transaksi jika bagian dari transaksi dibatalkan secara kondisional. Jika transaksi digulung balik ke titik penyimpanan, transaksi harus dilanjutkan ke penyelesaian dengan pernyataan yang lebih Transact-SQL jika diperlukan dan COMMIT TRANSACTION pernyataan, atau harus dibatalkan sama sekali dengan menggulirkan transaksi kembali ke awalnya. Untuk membatalkan seluruh transaksi, gunakan formulir ROLLBACK TRANSACTION transaction_name. Semua pernyataan atau prosedur transaksi dibatalkan.
Nama titik penyimpanan duplikat diizinkan dalam transaksi, tetapi ROLLBACK TRANSACTION pernyataan yang menentukan nama titik simpan hanya menggulung kembali transaksi ke yang terbaru SAVE TRANSACTION menggunakan nama tersebut.
SAVE TRANSACTION tidak didukung dalam transaksi terdistribusi yang dimulai secara eksplisit dengan BEGIN DISTRIBUTED TRANSACTION atau dipromosikan dari transaksi lokal.
Nota
Mesin Database tidak mendukung transaksi berlapis yang dapat dikelola secara independen. Penerapan penurunan @@TRANCOUNT transaksi dalam tetapi tidak memiliki efek lain. Pemutaran kembali transaksi dalam selalu mengembalikan transaksi luar, kecuali ada titik penyimpanan dan ditentukan dalam ROLLBACK pernyataan.
Perilaku penguncian
Pernyataan ROLLBACK TRANSACTION yang menentukan savepoint_name melepaskan kunci apa pun yang diperoleh di luar titik penyimpanan, kecuali untuk kunci yang diekskalasi dan dikonversi. Kunci ini tidak dilepaskan, dan tidak dikonversi kembali ke mode kunci sebelumnya.
Permissions
Memerlukan keanggotaan dalam peran tersebut public .
Examples
Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.
Contoh berikut menunjukkan cara menggunakan titik penyimpanan transaksi untuk mengembalikan hanya modifikasi yang dilakukan oleh prosedur tersimpan jika transaksi dimulai sebelum prosedur tersimpan dijalankan.
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
Konten terkait
- MULAI TRANSAKSI (Transact-SQL)
- TRANSAKSI PENERAPAN (T-SQL)
- KOMITMEN PEKERJAAN (Transact-SQL)
- ERROR_LINE (T-SQL)
- ERROR_MESSAGE (T-SQL)
- ERROR_NUMBER (T-SQL)
- ERROR_PROCEDURE (T-SQL)
- ERROR_SEVERITY (T-SQL)
- ERROR_STATE (T-SQL)
- RAISERROR (Transact-SQL)
- TRANSAKSI ROLLBACK (Transact-SQL)
- PEKERJAAN ROLLBACK (Transact-SQL)
- COBA... CATCH (Transact-SQL)
- XACT_STATE (Transact-SQL)
- Panduan penguncian transaksi dan penerapan versi baris