14. maj 2009 - 22:00Der er
3 kommentarer og 1 løsning
ROWLOCK Update - NOLOCK i joins(Select)
Hej. 1. Kan der opnåes mindre låsning (og dermed mindre risiko for block) ved at sætte (ROWLOCK) på en update, når der opdateres på en unique row vha. f.eks. RowId (update myTable set Name = @name where RowId = @RowId ) hvor RowId er unique primary key ?
2. Jeg har læst flere sige at man bør benytte (nolock) i joins (Select). F.eks.: SELECT COUNT(Users.UserID) FROM Users WITH (NOLOCK) JOIN UsersInUserGroups WITH (NOLOCK) ON Users.UserID = UsersInUserGroups.UserID
Er der nogen der har kommentare til dette ? Det er vel stadig afhængig af situationen, om man kan leve med evt. dirty data ?
1. Når du opdaterer en row, vil SQL Server automatisk lave en rowlock.
2. Du bør kun bruge nolock, hvis du har en meget god grund til det. At bruge nolock i en select, kan resultere i at der returneres ikke-comitted data. Dette kan resultere i noget rigtigt rod! SQL Serverens standard locking er i langt de fleste tilfælde det bedste at bruge.
Grunden til at nogen bruger rowlocks, er for at forbedre performance når der kører mange selects, samme tid som der køres mange updates. Men det er lige præcist i disse tilfælde, at nolock hintet har stor risiko for at resultere i fejl. Og for det meste, er der meget mere at hente, ved at designe databasen rigtigt, med constraints og indexes.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.