Sql Server’da Nested Transaction Kullanımı

Herkese merhaba, Sql Server yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda nested transaction konusunu anlatacağım. Hadi başlayalım !
Table of Contents
Nested transactionlar, bir işlem içinde birden fazla transaction’un yer alması durumunda kullanılan bir yöntemdir. Bu işlemde, iç içe transaction’lar kullanılarak, her bir transaction ayrı ayrı işlem yapabilir. Bu sayede, bir hata oluşması durumunda, yalnızca o transaction geri alınır ve diğer transaction’lar devam eder.
SQL Server, nested transactionları destekleyen veritabanı yönetim sistemlerinden biridir. Bu makalede, SQL Server’da nested transactionlar hakkında bilgi vereceğim ve birkaç örnek göstereceğim.
Nested Transaction Nedir?
Nested transaction, bir işlem içinde birden fazla transaction’ın yer almasıdır. İç içe transaction’lar kullanarak, her bir transaction ayrı ayrı işlem yapabilir. Bu sayede, bir hata oluşması durumunda, yalnızca o transaction geri alınır ve diğer transaction’lar devam eder. Bu yöntem, işlem performansını artırır ve veri bütünlüğünü korur.
Nested Transaction Nasıl Kullanılır?
SQL Server’da nested transaction’lar, BEGIN TRANSACTION, COMMIT TRANSACTION ve ROLLBACK TRANSACTION komutları kullanılarak tanımlanır. Her bir transaction için, bu komutlar kullanılarak işlem başlatılır, işlem tamamlanır veya geri alınır.
Aşağıdaki örnek, bir nested transaction kullanarak, bir siparişin işlenmesi ve kaydedilmesini gösterir:
BEGIN TRANSACTION; -- Transaction 1
INSERT INTO orders (order_id, customer_id, order_date) VALUES (1, 100, '2023-04-11');
BEGIN TRANSACTION; -- Transaction 2
INSERT INTO order_items (order_id, product_id, quantity) VALUES (1, 200, 2);
COMMIT TRANSACTION; -- Transaction 2
INSERT INTO order_items (order_id, product_id, quantity) VALUES (1, 300, 3);
COMMIT TRANSACTION; -- Transaction 1
Yukarıdaki örnek, iki transaction içerir. İlk transaction, orders tablosuna bir sipariş kaydediyor. İkinci transaction, order_items tablosuna ürünlerin kaydedilmesini sağlıyor. Eğer ikinci transaction’da bir hata oluşursa, sadece ikinci transaction geri alınır. İlk transaction ise devam eder.
Aşağıdaki örnek ise, bir nested transaction kullanarak, bir siparişin işlenmesinde bir hata oluşması durumunda geri alma işlemini gösterir:
BEGIN TRANSACTION; -- Transaction 1
INSERT INTO orders (order_id, customer_id, order_date) VALUES (1, 100, '2023-04-11');
BEGIN TRANSACTION; -- Transaction 2
INSERT INTO order_items (order_id, product_id, quantity) VALUES (1, 200, 2);
ROLLBACK TRANSACTION; -- Transaction 2
COMMIT TRANSACTION; -- Transaction 1
Yukarıdaki örnek, iki transaction içerir. İlk transaction, orders tablosuna bir sipariş kaydediyor. İkinci transaction, order_items tablosuna ürünler ekleniyor. Ancak ikinci transaction’da bir hata oluştuğunda, ROLLBACK TRANSACTION komutu kullanılarak, sadece ikinci transaction geri alınır ve ilk transaction devam eder.
Nested Transaction Örnekleri
Aşağıdaki örnek, nested transaction kullanarak, bir çalışanın maaş artışının hesaplanması ve kaydedilmesini gösterir:
BEGIN TRANSACTION; -- Transaction 1
DECLARE @employee_id INT = 100;
DECLARE @old_salary DECIMAL(18,2);
DECLARE @new_salary DECIMAL(18,2);
SELECT @old_salary = salary FROM employees WHERE employee_id = @employee_id;
SET @new_salary = @old_salary * 1.1;
BEGIN TRANSACTION; -- Transaction 2
UPDATE employees SET salary = @new_salary WHERE employee_id = @employee_id;
COMMIT TRANSACTION; -- Transaction 2
INSERT INTO salary_history (employee_id, old_salary, new_salary, change_date) VALUES (@employee_id, @old_salary, @new_salary, GETDATE());
COMMIT TRANSACTION; -- Transaction 1
Yukarıdaki örnek, iki transaction içerir. İlk transaction, bir çalışanın eski maaşını alır ve yeni maaşı hesaplar. İkinci transaction, bu yeni maaşı employees tablosuna kaydeder. Eğer ikinci transaction’da bir hata oluşursa, sadece ikinci transaction geri alınır ve ilk transaction devam eder. İlk transaction, yeni maaşı salary_history tablosuna kaydeder.
Aşağıdaki örnek ise, nested transaction kullanarak, bir siparişin işlenmesinde bir hata oluşması durumunda geri alma işlemini gösterir:
BEGIN TRANSACTION; -- Transaction 1
DECLARE @order_id INT;
DECLARE @customer_id INT = 100;
DECLARE @order_date DATE = '2023-04-11';
INSERT INTO orders (customer_id, order_date) VALUES (@customer_id, @order_date);
SET @order_id = SCOPE_IDENTITY();
BEGIN TRANSACTION; -- Transaction 2
DECLARE @product_id INT = 200;
DECLARE @quantity INT = 2;
INSERT INTO order_items (order_id, product_id, quantity) VALUES (@order_id, @product_id, @quantity);
SET @product_id = 300;
SET @quantity = 3;
INSERT INTO order_items (order_id, product_id, quantity) VALUES (@order_id, @product_id, @quantity);
IF @quantity > 5 RAISERROR('Maximum quantity exceeded', 16, 1);
COMMIT TRANSACTION; -- Transaction 2
INSERT INTO order_history (order_id, order_date, status) VALUES (@order_id, @order_date, 'COMPLETED');
COMMIT TRANSACTION; -- Transaction 1
Yukarıdaki örnek, iki transaction içerir. İlk transaction, bir siparişin kaydedilmesini sağlar. İkinci transaction, sipariş ürünlerinin kaydedilmesini sağlar. Ancak ikinci transaction’da, 5 adet üründen fazla eklenirse, bir hata oluşur ve Raiserror ile hata mesajı gösterilir. Bu durumda, sadece ikinci transaction geri alınır ve ilk transaction devam eder. İlk transaction, siparişin tamamlandığına dair bir kayıt oluşturur.
Dikkat Edilmesi Gereken Noktalar
Nested transaction kullanırken dikkat edilmesi gereken bazı noktalar vardır:
- COMMIT TRANSACTION komutu, transaction’ın tamamını geri almak yerine, sadece en son transaction’ı geri alır. Eğer nested transaction kullanıyorsanız, COMMIT TRANSACTION komutunu dikkatli bir şekilde kullanmalısınız.
- Eğer bir nested transaction geri alındıysa, tüm üst transaction’lar da geri alınır. Bu nedenle, bir nested transaction geri alındığında, tüm transaction’ları geri almak istemiyorsanız, COMMIT TRANSACTION komutunu kullanmadan önce, @@TRANCOUNT değişkenini kontrol etmelisiniz.
- Eğer bir hata oluştuğunda, ROLLBACK TRANSACTION komutu kullanarak, tüm transaction’ları geri alın. Ancak, nested transaction kullanırken, sadece en son transaction’ı geri almak için ROLLBACK TRANSACTION komutu kullanmanız gerekiyor. Aksi takdirde, tüm transaction’lar geri alınır.
- Eğer bir nested transaction, bir hata oluştuğunda geri alınırken, @@TRANCOUNT değişkeni, geri alınan transaction sayısını gösterir. Bu nedenle, ROLLBACK TRANSACTION komutunu kullandıktan sonra, @@TRANCOUNT değişkenini kontrol ederek, tüm transaction’ların geri alındığından emin olmalısınız.
Sonuç
Bu makalede, SQL Server’da nested transaction kavramını anlattık. Nested transaction, bir transaction’ın içinde başka bir transaction kullanarak, işlemleri daha detaylı ve güvenli bir şekilde yapmayı sağlar. Ancak, nested transaction kullanırken dikkatli olunması gereken bazı noktalar vardır. Bu nedenle, nested transaction kullanırken, dikkatli bir şekilde planlama yapılmalı ve hata durumlarında geri alma işlemleri doğru bir şekilde uygulanmalıdır.
Evet Sql Server’da nested transaction kullanımı bu şekilde olmakta. Tüm Sql Server yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.