Kaynaklara Aynı Anda Erişerek Oluşan Deadlock Sorununu Çözme

Kaynaklara Aynı Anda Erişerek Oluşan Deadlock Sorununu Çözme Daha önde deadlock olayını bahsetmiştik. Şimdi sizlere örnekle göstereceğiz. Tablo oluşturmak için kullanabileceğiniz bir komut:   CREATE TABLE ProductSold ( ProductID INT PRIMARY KEY, ProductName VARCHAR(50), QuantitySold INT ); — INSERT INTO ProductSold (ProductID, ProductName, QuantitySold) VALUES (1, ‘Product A’, 10), (2, ‘Product B’, 20), (3, ‘Product…

July 9, 2023 by Aryasoft IT

Kaynaklara Aynı Anda Erişerek Oluşan Deadlock Sorununu Çözme

Daha önde deadlock olayını bahsetmiştik. Şimdi sizlere örnekle göstereceğiz.

Tablo oluşturmak için kullanabileceğiniz bir komut:

 

CREATE TABLE ProductSold

(

ProductID INT PRIMARY KEY,

ProductName VARCHAR(50),

QuantitySold INT

);

INSERT INTO ProductSold (ProductID, ProductName, QuantitySold)

VALUES (1, ‘Product A’, 10),

(2, ‘Product B’, 20),

(3, ‘Product C’, 30);

CREATE TABLE UpdatedInventory

(

ProductID INT PRIMARY KEY,

ProductName VARCHAR(50),

QuantityInStock INT

);

INSERT INTO UpdatedInventory (ProductID, ProductName, QuantityInStock)

VALUES (1, ‘Product A’, 100),

(2, ‘Product B’, 200),

(3, ‘Product C’, 300);

 

Ardından, Session 1 ve Session 2’den birer ifade çalıştırarak bir kilitlenme oluşturabiliriz.

Session 1: Bu, ProductSold tablosunu güncelleyen ve ardından UpdateInventory tablosunu güncellemeye çalışan A İşlemini temsil eder:

 

— Session 1

BEGIN TRAN;

— Transaction A acquires a shared lock

UPDATE ProductSold

SET QuantitySold = QuantitySold + 1

WHERE ProductID = 1;

— Transaction A requests an exclusive lock

UPDATE UpdatedInventory

SET QuantityInStock = QuantityInStock – 1

WHERE ProductID = 1;

 

Session 2: Bu, UpdatedInventory tablosunu güncelleyen ve ardından ProductSold tablosunu güncellemeye çalışan İşlem B’yi temsil eder:

 

— Session 2

BEGIN TRAN;

— Transaction B acquires a shared lock on

UPDATE UpdatedInventory

SET QuantityInStock = QuantityInStock – 10

WHERE ProductID = 1;

— Transaction B requests an exclusive lock

UPDATE ProductSold

SET QuantitySold = QuantitySold + 10

WHERE ProductID = 1;

 

Burada bir kerelik ProductSold tablosunun önce güncellendiğini ve ikinci kez UpdateInventory tablosunu yükselttiğini görebilirsiniz. Bu, daha sonra aynı Sessionda aynı tablolara erişildiğinde sonuçta deadlock’a yol açar.

Deadlock’ları önlemek için, nesnelere her iki Sessionda da aynı sırayla erişeceğiz: önce ProductSold, ardından UpdateInventory. Veri değişiklikleri için stored procedures’leri kullanacağız.

İşte oluşturduğumuz stored procedures. Yalnızca iki tablo olduğu ve her ikisi de benzer işlemler yaptığı için tek bir Stored Procedure oluşturabiliyoruz.

 

CREATE PROCEDURE UpdateProductSoldAndInventory1

@ProductID INT,

@Quantity INT

AS

BEGIN

— Update the ProductSold table

UPDATE ProductSold SET QuantitySold = QuantitySold + @Quantity

WHERE ProductID = @ProductID;

— Update the UpdatedInventory table

UPDATE UpdatedInventory SET QuantityInStock = QuantityInStock – @Quantity

WHERE ProductID = @ProductID;

END;

 

Şimdi, bu Stored Procedure’leri kullanarak Sessionları yeniden yazalım:

1.Session:

BEGIN TRAN;

— Use the first stored procedure

EXEC UpdateProductSoldAndInventory1 @ProductID = 1, @Quantity = 1;

COMMIT;

2. Session

BEGIN TRAN;

— Use the first stored procedure

EXEC UpdateProductSoldAndInventory1 @ProductID = 1, @Quantity = 10;

COMMIT;

 

Veri değişiklikleri için Stored Procedure’leri kullanarak ve objelere aynı sırayla erişerek, deadlock sorunlarını minimize ettik.