Isolation Level of MS SQL Server
Join the DZone community and get the full member experience.
Join For Free
Introduction
Before understanding the
Isolation Level of Microsoft SQL Server, we must recall the first class
of Relational Database Management system (RDBAMS) and the ACID
property of RDBMS.
A
|
Atomic
|
C
|
Consistency
|
I
|
Isolation
This property means that
each transaction is executed in isolation from others, and that
concurrent transactions do not affect the transaction.
|
D
|
Durability
|
Types of Isolation Level in MS SQL Server
There are five type of Isolation level in MS SQL Server
1. Read Committed (The Default Isolation Level of MS SQL Server)
2. Read Uncommitted
3. Repeatable Read
4. Serializable
5. Snapshot
Before further proceed with Isolation level we have to clear understanding about two things
Dirty Reads
This is when we read uncommitted data, when doing this there is no guarantee that data read will ever be committed.
Phantom Reads
This is when data that we
are working with has been changed by another transaction since you
first read it in. This means subsequent reads of this data in the same
transaction could well be different.
To Check the Current Isolation Level
DBCC useroptions
Read Committed Isolation Level
Specifies that statements
cannot read data that has been modified but not committed by other
transactions. This prevents dirty reads. Data can be changed by other
transactions between individual statements within the current
transaction, resulting in nonrepeatable reads or phantom data. This
option is the SQL Server default.
-- Query-1 of Session -1 BEGIN TRAN UPDATE tbl_Test SET Col1 = 2; WAITFOR DELAY '00:00:10'; ROLLBACK --Query-2 of Session -2 SELECT * FROM tbl_Test;
In the above example the
Query-2 is waiting for Query-1 to complete. When the Query-1 is
completed then the Query-2 retrieves records.
Read Uncommitted Isolation Level
In this Isolation level, a
transaction can read the data which is modified by some other
transactions but still not committed. This Isolation level do not issue
shared locked to prevent data modification which is read by some other
transactions. Also it is not issue exclusive locks to prevents
transactions from reading data which is modified from other transaction
by not committed yet. It may results in problem like dirty read, lost
updates, phantom reads etc. It is the least restrictive Isolation
level.
-- Query-1 of Session - 1 BEGIN TRAN UPDATE tbl_Tests SET Col1 = 2; WAITFOR DELAY '00:00:10'; ROLLBACK -- Query-2 of Session - 2 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM tbl_Tests;
Here in this example
Query-2 is not waiting for Query-1. Query-2 returns records without
waiting for Query-1 my cause of Dirty data.
Repeatable Read Isolation Level
This isolation level is
higher than the previous two mention isolation level and it does not
allows any transaction to read a data that is being modified by some
other transaction but not committed yet. Also it doesn't allow any
transaction to modify a data if it is being read by some other
transaction until the transaction reading that data complete its
operation. This way it eliminates the dirty read and Repeatable reads
problem but it doesn't eliminates the Phantom reads.
--Query - 1 of Session - 1 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ BEGIN TRAN SELECT * FROM tbl_Tests; WAITFOR DELAY '00:00:10'; SELECT * FROM tbl_Tests; ROLLBACK --Query - 2 of Session - 2 UPDATE tbl_Tests SET Col1 = -1
In the above example
Query-1 returns the same data for both selects even though you ran a
query to modify the data before the second select ran. This is because
the Update query (Query-2) was forced to wait for Query-1 to finish due
to the exclusive locks that were opened as you specified Repeatable
Read.
Serializable Isolation Level
This Isolation level do
not allow any transaction to read the data unless the other
transactions completed their data modification operation. Also it
doesn't allow other transactions to modify the data until the current
transaction completed its read operation. This isolation level allows a
transaction to acquire a read lock (if only read operation) or write
lock (for insert,delete,update) for the entire range of records that
the transaction is going to affect.
--Query - 1 of Session -1 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRAN SELECT * FROM tbl_Tests; WAITFOR DELAY '00:00:10'; SELECT * FROM tbl_Tests; ROLLBACK --Query - 2 of Session -2 INSERT INTO tbl_Tests(Col1,Col2,Col3) VALUES (100,100,100);
In the above example we
will see that the insert in Query-2 waits for Query-1 to complete
before it runs eradicating the chance of a phantom read.
If we change the isolation
level in Query-1 to repeatable read, we will see the insert no longer
gets blocked and the two seleclt statements in Query-1 return a
different amount of rows.
Snapshot Isolation Level
In this isolation level, a
transaction recognise only data which is committed before the start of
the transaction. Any modification of the data after the transaction is
begin, is not visible to any statements of the currently executing
transaction. It is like a snapshot of data, given to each transaction.
It is done with the help of row version where a separate version of
each modified row is maintain in the temp db database dedicated to the
transactions. This isolation level eliminates dirty reads, lost
updates, repeatable reads and Phantom reads problem.
ALTER DATABASE myDb SET ALLOW_SNAPSHOT_ISOLATION ON;
Hope you like it.
Isolation (database systems)
Database
Microsoft SQL Server
sql
Data (computing)
Published at DZone with permission of Joydeep Das, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Trending
-
Part 3 of My OCP Journey: Practical Tips and Examples
-
Transactional Outbox Patterns Step by Step With Spring and Kotlin
-
What Is Envoy Proxy?
-
Cucumber Selenium Tutorial: A Comprehensive Guide With Examples and Best Practices
Comments