Forum
Merhaba,
SQL 2000 üzerindeki datayı SQL 2008 Server' a taşıdıktan sonra database de en çok satır bulunan tablo üzerinde işlem yapılırken
Transaction (Process ID 59) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction
hatası alıyoruz. Tablo üzerinde 3 tane trigger var (Insert,Update,Delete)
Bu hatayı nasıl düzeltebilirim
2 kullanıcı olsun ve iki kullanıcının da kilitlediği ayrı objeler olsun. Bu iki kullanıcının her ikisi de diğer kişinin objesini aynı zamanda kilitlemeye çalışırsa sql server bu kilitleme için beklemeye girer ve eğer zaman aşımı gerçekleşirse kullanıcılardan -rastgele- birisinin kilidini iptal eder ve bu hatayı verir. En çok satır bulunan tabloda hata almanızın nedeni de bu sürenin yetersiz gelişi.
SET DEADLOCK_PRIORITY LOW;
GO
Dener misiniz?
SET DEADLOCK_PRIORITY { LOW | NORMAL | HIGH | <numeric-priority> | @deadlock_var | @deadlock_intvar }
<numeric-priority> ::= { -10 | -9 | -8 | … | 0 | … | 8 | 9 | 10 }
Merhaba,
Farklı versiyonlar arasındaki "Lock Escalation" 'dan kaynaklanabileceğinden şüpheleniyorum. Bunun için Lock:Escalation olaylarını kontrol eder misiniz?
http://support.microsoft.com/kb/323630
Saygılar,
Mert Bey,
dediğiniz olayı yaptım ancak deneme fırsatım olmadı. Gündüz kullanıcı sayısı arttığında hatayı alıyoruz. Kullanıcı sayısı arttığında sonucu iletiyor olacağım.
teşekkurler
Selahattin Hocam,
eski versiyonda lock escalation' u nasıl kontrol edeceğimi bulamadım. Söz konusu tabloya
ALTER TABLE orders SET CONSTRAINT (LOCK_ESCALATION = DISABLE)
GO
bu komutu eklersem yeterli olur mu? Eski ve yeni arasında karşılaştırma yapamadım.
Teşekkür ederim
Merhaba,
Kontrol etmeden önce SQL Server 2000 'den 2008 'e geçiş yaptıktan sonra şu komutları çalıştırdınız mı?
1. DBCC UPDATEUSGAE
2. UPDATE STATS WITH FULLSCAN
3. REBUILD ALL INDEXES
eğer çalıştırmadınız ise o zaman çalıştırmanızı tavsiye ederim.Ayrıca SQL 2008 üzerinde SELECT @@VERSION çıktısının sonucunuda yazar mısınız?
Saygılar,
Selahattin Hocam,
3 komutuda çalıştırdım, kullanıcılar çalışıyorlar bir süre sonra yine aynı hatayı almayacağımız belli olur. sonucu yazarım
versiyon çıktısı da şöyle
(No column name)
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
Teşekkürler
Birde performans kötü duruma geldiği anda ;
select st.text,sp.* from sys.sysprocesses sp
cross apply sys.dm_exec_sql_text(sp.sql_handle) st
where sp.cpu > 100
order by sp.cpu desc
sorgusunun çıktısını gönderirmisin.
Saygılar,
Merhaba, bu sorunu aşağıdaki scriptle defrag yaparak aştık. Aynı zamanda indexleri yenilememizde gerekti.
/*Perform a 'USE <database name>' to select the database in which to run the script.*/
-- Declare variables
SET NOCOUNT ON;
DECLARE @tablename varchar(255);
DECLARE @execstr varchar(400);
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @frag decimal;
DECLARE @maxfrag decimal;
-- Decide on the maximum fragmentation to allow for.
SELECT @maxfrag = 30.0;
-- Declare a cursor.
DECLARE tables CURSOR FOR
SELECT TABLE_SCHEMA + '.' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE';
-- Create the table.
CREATE TABLE #fraglist (
ObjectName char(255),
ObjectId int,
IndexName char(255),
IndexId int,
Lvl int,
CountPages int,
CountRows int,
MinRecSize int,
MaxRecSize int,
AvgRecSize int,
ForRecCount int,
Extents int,
ExtentSwitches int,
AvgFreeBytes int,
AvgPageDensity int,
ScanDensity decimal,
BestCount int,
ActualCount int,
LogicalFrag decimal,
ExtentFrag decimal);
-- Open the cursor.
OPEN tables;
-- Loop through all the tables in the database.
FETCH NEXT
FROM tables
INTO @tablename;
WHILE @@FETCH_STATUS = 0
BEGIN
-- Do the showcontig of all indexes of the table
INSERT INTO #fraglist
EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''')
WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS');
FETCH NEXT
FROM tables
INTO @tablename;
END;
-- Close and deallocate the cursor.
CLOSE tables;
DEALLOCATE tables;
-- Declare the cursor for the list of indexes to be defragged.
DECLARE indexes CURSOR FOR
SELECT ObjectName, ObjectId, IndexId, LogicalFrag
FROM #fraglist
WHERE LogicalFrag >= @maxfrag
AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;
-- Open the cursor.
OPEN indexes;
-- Loop through the indexes.
FETCH NEXT
FROM indexes
INTO @tablename, @objectid, @indexid, @frag;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ',
' + RTRIM(@indexid) + ') - fragmentation currently '
+ RTRIM(CONVERT(varchar(15),@frag)) + '%';
SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',
' + RTRIM(@indexid) + ')';
EXEC (@execstr);
FETCH NEXT
FROM indexes
INTO @tablename, @objectid, @indexid, @frag;
END;
-- Close and deallocate the cursor.
CLOSE indexes;
DEALLOCATE indexes;
-- Delete the temporary table.
DROP TABLE #fraglist;
GO