Har följande SQL skript som läser in en fil (IMAGE) till db. Transactions kan du köra med, men varför ha ett så restriktivt lås i en SELECT sats? Där behöver du inga lås, normalt sett. Dessutom, i de allra flesta fall hanterar SQL Server låsningen bättre än utvecklaren/dba:n. Kör utan lås i SQL-satsen och SQL Server kommer att lägga lämpliga lås. Är inte med på vad du menar med att SQL Server hanterar det bättre? OK, då förstår jag bättre varför du gör så. Men du borde kunna ta bort HOLDLOCK och bara köra TABLOCKX? HOLDLOCK : Hold a shared lock until completion of the transaction. Men tablockx gör i princip samma sak:Problem med SQL skript, ger låsningar
I utvecklings db går allt fint men i prod där det är mer data och ett gäng aktiva användare tar det mycket lång tid att läsa in filen. Tabellen där innehåller ca 4000 rader.
Är dålig på att felsöka SQL men jag misstänker att låsningar sker och att det ger fördröjning.
Tacksam för lite hjälp...
denna tar ca 50 sek att köra.
SQL = @"BEGIN TRANSACTION DECLARE @MaxCid int SET @MaxCid = (SELECT MAX(cid) FROM tbl_DefFiles WITH (TABLOCKX HOLDLOCK))
IF @MaxCid IS NULL
SET @MaxCid = 1
ELSE
SET @MaxCid = @MaxCid + 1
INSERT INTO tbl_DefFiles (cid, Binder_cid, ChangedBy_cid, ChangedDate, CreatedBy_cid, CreatedDate, FileImage, FileName, FileType, IsDirectory)
VALUES (@MaxCid, " + binderCid + @", 101, '2007-8-9 8:53:26', 101, '2007-8-9 8:53:26', @byteFileImage, '" + fileName + "','" + fileType + @"', 0)
SELECT @MaxCid COMMIT TRANSACTION";
EDIT: testade att ta bort Transactions delen och då körs frågan på < 1sec, men transaktions hanteringen kan jag inte vara utan.
DECLARE @MaxCid int SET @MaxCid = (SELECT MAX(cid) FROM tbl_DefFiles)
IF @MaxCid IS NULL
SET @MaxCid = 1
ELSE
SET @MaxCid = @MaxCid + 1
INSERT INTO tbl_DefFiles (cid, Binder_cid, ChangedBy_cid, ChangedDate, CreatedBy_cid, CreatedDate, FileImage, FileName, FileType, IsDirectory)
VALUES (@MaxCid,30570, 101, '2007-8-9 8:53:26', 101, '2007-8-9 8:53:26', '00000000000000', 'candidator','.xxx', 0)
SELECT @MaxCidSv: Problem med SQL skript, ger låsningar
Sv:Problem med SQL skript, ger låsningar
Kan förstå att "SELECT @MaxCid COMMIT TRANSACTION" denna select ska ligga utanför transaktionen, men kan även tycka att då den endast läser från variablen inte från själva tabellen att det inte spelar någon roll.
----------------------------------------------------
I detta fall räknar inte SQL Server själv upp ID, detta görs manuellt.
Hämtar senaste ID från tabellen ( SELECT MAX(cid) FROM tbl_DefFiles ), lägger sedan på 1 för att skapa nytt ID.
För att detta ID ska var unikt måste jag ju låsa tabellen för att förhindra att andra användare skapar samma ID, eller?
-----------------------------------------------------Sv: Problem med SQL skript, ger låsningar
Sv:Problem med SQL skript, ger låsningar
Är inte detta nödvändigt för att inte riskera att andra användare skapar rader med samma ID?
OM denna ej används tror du du det ger en prestanda förbättring?Sv: Problem med SQL skript, ger låsningar
TABLOCKX Use an exclusive lock on a table. This lock prevents others from reading or updating the table and is held until the end of the statement or transaction.
Borde räcka med den...