Manchmal möchte man ein nicht-blockierendes SELECT auf einer Tabelle machen. Dazu verwendet man einfach:
SELECT * FROM MyTable WITH(NOLOCK)
Das Problem an NOLOCK ist, dass es ein “dirty” Read ist. Also wenn z.B. eine Transaktion ein INSERT auf diese Tabelle macht aber noch nicht commited ist, gibt das SELECT mit NOLOCK diese Row bereits zurück! Wenn und die Transaktion zurückgesetzt wird (Rollback), wird dieser Row wieder gelöscht und unser SELECT hat einen nicht mehr exisiterenden Eintrag.
Um dieses Problem zu umgehen kann man statt NOLOCK einfach READPAST verwenden. Das Statement sieht dann so aus:
SELECT * FROM MyTable WITH(READPAST)
Nun werden Zeilen die gesperrt sind einfach ignoriert. Dies beinhaltet allerdings auch Zeilen die über ein UPDATE gesperrt sind! Also immer aufpassen und abschätzen, was man braucht.
Weitere Links:
– Table Hints (Transact-SQL)
– Using NOLOCK and READPAST table hints in SQL Server