SQL Server allow locking different type resources to
maintain accurate read and writes, locking at smaller resources like rows, key page
maintain high concurrency but cause overhead on engine as lots of lock to be
maintained. And locking on bigger resources like table, DB cause low
concurrency but little overhead for fewer number of locks.
SQL Server can place locks on different type of resources:
·
RID:
Row identifier. Used to lock a single row within a table.
·
KEY: Row lock within an index.
Used to protect key ranges in serializable transactions.
·
Page: 8 kilobyte data page or
index page.
· Extent: Contiguous group of eight data pages or index pages.
· Table: Entire table, including all data and indexes.
· DB: Database.
SQL Server place lock on resources using multiple lock
modes:
1.
Shared (S): Shared (S) locks allow
concurrent transactions to read (SELECT) a resource. No other transactions can
modify the data while shared (S) locks exist on the resource. Shared (S) locks
on a resource are released as soon as the data has been read, unless the
transaction isolation level is set to repeatable read or higher, or a locking
hint is used to retain the shared (S) locks for the duration of the transaction.
2. Update (U): Update
(U) locks prevent a common form of deadlock. A typical update pattern consists
of a transaction reading a record, acquiring a shared (S) lock on the resource
(page or row), and then modifying the row, which requires lock conversion to an
exclusive (X) lock. If two transactions acquire shared-mode locks on a resource
and then attempt to update data concurrently, one transaction attempts the lock
conversion to an exclusive (X) lock. The shared-mode-to-exclusive lock
conversion must wait because the exclusive lock for one transaction is not
compatible with the shared-mode lock of the other transaction; a lock wait
occurs. The second transaction attempts to acquire an exclusive (X) lock for
its update. Because both transactions are converting to exclusive (X) locks,
and they are each waiting for the other transaction to release its shared-mode
lock, a deadlock occurs. To
avoid this potential deadlock problem, update (U) locks are used. Only one
transaction can obtain an update (U) lock to a resource at a time. If a
transaction modifies a resource, the update (U) lock is converted to an
exclusive (X) lock. Otherwise, the lock is converted to a shared-mode lock.
3.
Exclusive
(X): Exclusive locks (X) are used to lock data being modified by one
transaction thus preventing modifications by other concurrent transactions. You
can read data held by exclusive lock only by specifying a NOLOCK hint or using
a read uncommitted isolation level. Because DML statements first need to read
the data they want to modify you'll always find Exclusive locks accompanied by
shared locks on that same data.
1.
Intent
(I) : An intent lock (I)
indicates that SQL Server wants to acquire a shared (S) lock or exclusive (X)
lock on some of the resources lower down in the hierarchy. For example, a
shared intent lock placed at the table level means that a transaction intends
on placing shared (S) locks on pages or rows within that table. Setting an
intent lock at the table level prevents another transaction from subsequently
acquiring an exclusive (X) lock on the table containing that page. Intent locks
improve performance because SQL Server examines intent locks only at the table
level to determine if a transaction can safely acquire a lock on that table.
This removes the requirement to examine every row or page lock on the table to
determine if a transaction can lock the entire table. Intent locks include
intent shared (IS), intent exclusive (IX), and shared with intent exclusive
(SIX).
a.
Intent shared (IS): Indicates the
intention of a transaction to read some (but not all) resources lower in the
hierarchy by placing S locks on those individual resources.
b.
Intent exclusive (IX): Indicates
the intention of a transaction to modify some (but not all) resources lower in
the hierarchy by placing X locks on those individual resources. IX is a
superset of IS.
c.
Shared with intent exclusive (SIX):
Indicates the intention of the transaction to read all of the resources lower
in the hierarchy and modify some (but not all) resources lower in the hierarchy
by placing IX locks on those individual resources.
2.
Schema Lock (Sch-) : Schema
modification (Sch-M) locks are used when a table data definition language (DDL)
operation (such as adding a column or dropping a table) is being performed. Schema
stability (Sch-S) locks are used when compiling queries. Schema stability
(Sch-S) locks do not block any transactional locks, including exclusive (X)
locks. Therefore, other transactions can continue to run while a query is being
compiled, including transactions with exclusive (X) locks on a table. However,
DDL operations cannot be performed on the table.
3.
BULK
Update (BU): Bulk update (BU) locks are used when bulk copying data into a
table and either the TABLOCK hint
is specified or the table lock on bulk load table
option is set using sp_tableoption. Bulk update (BU) locks allow processes to bulk copy data
concurrently into the same table while preventing other processes that are not
bulk copying data from accessing the table.
Key - Range locks
Key-range locks protect a
range of rows implicitly included in a record set being read by a Transact-SQL
statement while using the serializable transaction isolation level. Key-range
locking prevents phantom reads. By protecting the ranges of keys between rows,
it also prevents phantom insertions or deletions into a record set accessed by
a transaction. In the example we can see that there are two types of key-range
locks taken:
- RangeX-X -
exclusive lock on the interval between the keys and exclusive lock on the
last key in the range
- RangeS-U –
shared lock on the interval between the keys and update lock on the last
key in the range
Locking Hints can be
specified using the SELECT, INSERT, UPDATE, and DELETE statements to direct SQL
Server™ 2000 to the type of locks to be used. Table-level locking hints can be
used when a finer control of the types of locks acquired on an object is
required. These locking hints override the current transaction isolation level
for the session.
HOLDLOCK: Hold a
shared lock until completion of the transaction instead of releasing the lock
as soon as the required table, row, or data page is no longer required.
HOLDLOCK is equivalent to SERIALIZABLE.
·
NOLOCK: Do not
issue shared locks and do not honour exclusive locks. When this option is in
effect, it is possible to read an uncommitted transaction or a set of pages
that are rolled back in the middle of a read. Dirty reads are possible. Only
applies to the SELECT statement.
·
READCOMMITTED: Perform a
scan with the same locking semantics as a transaction running at the READ
COMMITTED isolation level. By default, SQL Server 2000 operates at this
isolation level.
·
ROWLOCK: Use
row-level locks instead of the coarser-grained page- and table-level locks.
·
TABLOCK: Use a table
lock instead of the finer-grained row- or page-level locks. SQL Server holds
this lock until the end of the statement. However, if you also specify
HOLDLOCK, the lock is held until the end of the transaction.
·
UPDLOCK: Use update
locks instead of shared locks while reading a table, and hold locks until the
end of the statement or transaction. UPDLOCK has the advantage of allowing you
to read data (without blocking other readers) and update it later with the
assurance that the data has not changed since you last read it.
·
XLOCK: Use an exclusive lock
that will be held until the end of the transaction on all data processed by the
statement. This lock can be specified with either PAGLOCK or TABLOCK, in which
case the exclusive lock applies to the appropriate level of granularity.
EG: WITH (NOLOCK)
Nice Blog. its very informative, Thanks for the sharing such great information Biometric attendance machine supplier, Door frame metal detector suppliers
ReplyDelete