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