BEGIN TRANSACTION (Transact-SQL)

Açık, yerel bir işlemin başlangıç noktasını gösterir. BEGIN TRANSACTION, @@TRANCOUNT değerini 1 artırır.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

BEGIN { TRAN | TRANSACTION } 
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Bağımsız değişkenler

  • transaction_name
    İşleme atanan addır. transaction_name tanımlayıcılar için olan kurallara uymalıdır, ancak 32 karakterden uzun tanımlayıcılar kullanılamaz. İşlem adlarını yalnızca iç içe BEGIN...COMMIT veya BEGIN...ROLLBACK deyimlerinin en dışındaki çiftinde kullanın.

  • @tran\_name\_variable
    Geçerli bir işlem adı olan kullanıcı tanımlı bir değişkenin adıdır. Değişkenin bir char, varchar, nchar veya nvarchar veri türünde bildirilmesi gerekir. Değişkene 32 karakterden fazlası geçilirse, yalnızca ilk 32 karakter kullanılır; kalan karakterler atılır.

  • WITH MARK [ 'description' ]
    İşlemin günlükte işaretlendiğini belirtir. description işareti açıklayan bir dizedir. 128 karakterden daha uzun bir description, msdb.dbo.logmarkhistory tablosunda depolanmadan önce 128 karaktere kısaltılır.

    WITH MARK kullanılırsa, bir işlem adı belirtilmelidir. WITH MARK bir işlem günlüğünü adlandırılmış bir işarete geri döndürmeye izin verir.

Açıklamalar

BEGIN TRANSACTION, bir bağlantının başvuruda bulunduğu verilerin mantıksal ve fiziksel olarak tutarlı olduğu noktayı temsil eder. Hatalarla karşılaşılırsa, verilerde BEGIN TRANSACTION'dan sonra yapılan tüm değişiklikler, verileri bu bilinen tutarlılık durumuna döndürmek için geri alınabilir. Her işlem, hatasız tamamlanıp, değişikliklerin veritabanında kalıcı olması için COMMIT TRANSACTION çağrılana veya hatalarla karşılaşılıp tüm değişiklikler bir ROLLBACK TRANSACTION deyimi ile silininceye kadar sürer.

BEGIN TRANSACTION, deyimi gönderen bağlantı için yerel bir işlem başlatır. Geçerli işlem yalıtım düzeyi ayarlarına bağlı olarak bağlantı tarafından gönderilen Transact-SQL deyimlerini desteklemek için ayrılan pek çok kaynak, bir COMMIT TRANSACTION veya ROLLBACK TRANSACTION deyimiyle tamamlanana kadar işlem tarafından kilitlenir. Uzun süre tamamlanmadan kalan işlemler, diğer kullanıcıların bu kilitli kaynaklara erişmesini ve ayrıca günlüğün kırpılmasını engelleyebilir.

BEGIN TRANSACTION yerel bir işlemle başlasa da uygulama daha sonra, bir INSERT, UPDATE veya DELETE deyiminin yürütülmesi gibi günlüğe kaydedilmesi gereken bir eylem gerçekleştirinceye kadar işlem günlüğüne kaydedilmez. Uygulama, SELECT deyimlerinin işlem yalıtım düzeyini korumak için kilit alma gibi eylemler gerçekleştirebilir, ancak uygulama bir değişiklik eylemi gerçekleştirinceye kadar günlüğe hiçbir şey kaydedilmez.

İç içe bir dizi işlemdeki birden çok işlemi bir işlem adıyla adlandırmanın işlem üzerinde hemen hiçbir etkisi yoktur. Yalnızca ilk (en dıştaki) işlem adı sisteme kaydedilir. Başka herhangi bir ada (geçerli bir kaydetme noktası adı dışında) geri almak hata üretir. Geri almadan önce yürütülen deyimlerin hiçbiri gerçekte bu hata oluştuğunda geri alınmaz. Deyimler yalnızca dıştaki işlem geri alındığında geri alınır.

BEGIN TRANSACTION deyimi ile başlatılan yerel işlem, deyim yürütülmeden veya geri alınmadan önce aşağıdaki eylemler gerçekleştirilirse dağıtılmış bir işleme yükseltilir:

  • Bağlı bir sunucudaki uzak bir tabloya başvuran bir INSERT, DELETE veya UPDATE deyimi yürütülür. Bağlı sunucuya erişmek için kullanılan OLE DB sağlayıcısı ITransactionJoin arabirimini desteklemiyorsa INSERT, UPDATE veya DELETE deyimi hata verir.

  • REMOTE_PROC_TRANSACTIONS seçeneği ON olarak ayarlandığında, uzak bir saklı yordam çağrılır.

SQL Server'ın yerel kopyası işlem denetleyicisi haline gelir ve dağıtılmış işlemi yönetmek için Microsoft Dağıtılmış İşlem Düzenleyicisi'ni (MS DTC) kullanır.

Bir işlem BEGIN DISTRIBUTED TRANSACTION kullanılarak dağıtılmış bir işlem olarak açık biçimde yürütülebilir. Daha fazla bilgi için, bkz. BEGIN dağıtılmış hareket (Transact-sql).

İşaretlenen İşlemler

WITH MARK seçeneği işlem adının işlem günlüğüne konmasına neden olur. Bir veritabanını önceki bir durumuna geri getirirken, tarih ve saat yerine işaretli işlem kullanılabilir. Daha fazla bilgi için, bkz. İlişkili veritabanları sürekli kurtarmak için işaretlenen kullanımı (tam kurtarma modeli) ve RESTORE (Transact-SQL).

İşlem günlüğü işaretleri, ayrıca, bir grup ilişkili veritabanını mantıksal olarak tutarlı bir duruma döndürerek kurtarmak için de gereklidir. İşaretler, ilişkili veritabanlarının işlem günlüklerine dağıtılmış bir işlem tarafından yerleştirilebilir. İlişkili veritabanları grubunu bu işaretli noktalara döndürerek kurtarmak, işlemsel olarak tutarlı bir grup veritabanı ile sonuçlanır. İşaretlerin ilişkili veritabanlarına konması özel yordamlar gerektirir.

İşaret, işlem günlüğüne, yalnızca veritabanı işaretlenen işlemle güncelleştirilirse konur. Verileri değiştirmeyen işlemler işaretlenmez.

BEGIN TRAN new_name WITH MARK, var olan işaretlenmemiş bir işlemin içine yerleştirilebilir. Bu yapıldıktan sonra, işleme daha önce bir ad verilmiş de olsa new_name işlemin işaret adı olur. Aşağıdaki örnekte M2 işaretin adıdır.

BEGIN TRAN T1;
UPDATE table1 ...;
BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT * from table1;
COMMIT TRAN M2;
UPDATE table3 ...;
COMMIT TRAN T1;

BEGIN TRAN T1;
UPDATE table1 ...;
BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT * from table1;
COMMIT TRAN M2;
UPDATE table3 ...;
COMMIT TRAN T1;

İşlemleri iç içe geçirirken daha önce işaretlenmiş bir işlemi işaretlemeye çalışmak bir uyarı (hata değil) iletisi üretir:

"BEGIN TRAN T1 WITH MARK ...;"

"UPDATE tablo1 ...;"

"BEGIN TRAN M2 WITH MARK ...;"

"Sunucu: İlt. 3920, Düzey 16, Durum 1, Satır 3"

"WITH MARK seçeneği yalnızca ilk BEGIN TRAN WITH MARK deyimine uygulanır."

"Seçenek yoksayıldı."

İzinler

public rolüne üye olmayı gerektirir.

Örnekler

A.İşlem adlandırma

Aşağıdaki örnek bir işlemin nasıl adlandırılacağını göstermektedir:

DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;
USE AdventureWorks2012;
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;
GO

DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;
USE AdventureWorks2012;
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;
GO

B.İşlem işaretleme

Aşağıdaki örnek bir işlemin nasıl işaretleneceğini göstermektedir: CandidateDelete adlı işlem işaretlidir.

BEGIN TRANSACTION CandidateDelete
    WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2012;
GO
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO

BEGIN TRANSACTION CandidateDelete
    WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2012;
GO
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO

Ayrıca bkz.

Başvuru

BEGIN dağıtılmış hareket (Transact-sql)

TAMAMLAMA hareket (Transact-sql)

COMMIT work (Transact-sql)

rollback TRANSACTION (Transact-sql)

rollback work (Transact-sql)

HAREKET (Transact-sql) Kaydet