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…
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.