(source: simple-talk.com)
A deadlock occurs
when two or more sessions are waiting for each other, in such a way that none
can complete. SQL Server's lock monitor has a deadlock detector that
periodically checks the locks to see if there are any circular locking chains.
If it finds any, it selects one of the sessions associated with a suspended
thread, kills it, rolls back its transaction and releases its locks. The killed
session, known as the deadlock victim, receives error 1205.
The lock monitor picks the
deadlock victim based, firstly, on the setting
of DEADLOCK_PRIORITY for each session and, secondly (in the event of
a tie) on the amount of work that it will take to roll back each of the open
transactions. The DEADLOCK_PRIORITY is a session-scoped setting that
establishes the relative importance that the session completes its work should
it become embroiled in a deadlock. It can be set
to HIGH, NORMAL or LOW, with NORMAL being the
default.
Bookmark lookup deadlock Bookmark lookup deadlocks
are one of the most common deadlocks in SQL Server. Bookmark lookup deadlocks
generally have a SELECT statement as the victim, and
an INSERT, UPDATE, or DELETE statement as the other contributing
process to the deadlock. They occur partly as a general consequence of SQL
Server's pessimistic locking mechanisms for concurrency, but mainly due to the
lack of an appropriate covering index for the SELECT operation.
When a lookup
operation occurs, the database engine takes additional shared locks on the rows
or pages needed from the table. These locks are held for the duration of
the SELECT operation, or until lock escalation is triggered to
increase the lock granularity from row or page to table. When the data-changing
session executes, it acquires an exclusive lock on the row or page of the
clustered index or table. At the same time the SELECT operation
acquires a shared lock on the non-clustered index. The data-changing operation
requires an exclusive lock on the non-clustered index to complete the
modification, and the SELECT operation requires a shared lock on the
clustered index, or table, to perform the bookmark lookup. Shared locks and
exclusive locks are incompatible, so if the data-changing operation and the SELECT operation
affect the same rows, resulting in a deadlock.
Handling Deadlocks to Prevent Errors In most cases, the same issues that cause severe blocking in the
database, such as poor database design, lack of indexing, poorly designed
queries, inappropriate isolation level and so on, are also the common causes of
deadlocking. An important part of application and database design is defensive
programming; a technique that anticipates and handles exceptions as a part of
the general code base for an application or database. Defensive programming to
handle deadlock exceptions can be implemented in two different ways:
- database-side,
through the use of T-SQL TRY…CATCH blocks
- application-side,
through the use of application TRY…CATCH blocks.
In either case, proper handling of the 1205 exception raised by
SQL Server for the deadlock victim can help avoid UnhandledException errors
in the application and the ensuing end-user phone calls to Help Desk or
Support.
No comments:
Post a Comment