SQL Isolation Level
SQL Isolation Level
READ COMMITTED
READ UNCOMMITTED
REPEATABLE READ
SERIALIZABLE
SNAPSHOT
Note: Before executing each example in this article, reset the Emp table
values by executing the above script.
Read Committed
In select query it will take only commited values of table. If any transaction is
opened and incompleted on table in others sessions then select query will
wait till no transactions are pending on same table.
begin tran
update emp set Salary=999 where ID=1
waitfor delay '00:00:15'
commit
Session 2
Output
999
begin tran
select * from Emp
waitfor delay '00:00:15'
commit
Session2
Output
1000
In session2, there won't be any delay in execution because in session1 Emp
table is used under transaction but it is not used update or delete command
hence Emp table is not locked.
begin tran
select * from emp
waitfor delay '00:00:15'
update emp set Salary=999 where ID=1
commit
Session 2
Output
1000
In session2, there won't be any delay in execution because when session2 is
executed Emp table in session1 is not locked(used only select command,
locking on Emp table occurs after wait delay command).
Read Uncommitted
If any table is updated(insert or update or delete) under a transaction and
same transaction is not completed that is not committed or roll backed then
uncommitted values will displaly(Dirty Read) in select query of "Read
Uncommitted" isolation transaction sessions. There won't be any delay in
select query execution because this transaction level does not wait for
committed values on table.
begin tran
update emp set Salary=999 where ID=1
waitfor delay '00:00:15'
rollback
Session 2
Output
999
Select query in Session2 executes after update Emp table in transaction and
before transaction rolled back. Hence 999 is returned instead of 1000.
If you want to maintain Isolation level "Read Committed" but you want dirty
read values for specific tables then use with(nolock) in select query for
same tables as shown below.
Repeatable Read
select query data of table that is used under transaction of isolation level
"Repeatable Read" can not be modified from any other sessions till
transcation is completed.
Session 2
Output
Update command in session 2 will wait till session 1 transaction is completed
because emp table row with ID=1 has locked in session1 transaction.
Session 2
Output
Result in Session 1.
session 2 will execute without any delay because it has insert query for new
entry. This isolation level allows to insert new data but does not allow to
modify data that is used in select query executed in transaction.
You can notice two results displayed in Session 1 have different number of
row count(1 row extra in sectond result set).
Repeatable Read Example 3
Session 1
Session 2
Output
session 2 will execute without any delay because row with ID=3 is not locked,
that is only 2 records whose IDs are 1,2 are locked in Session 1.
Serializable
Serializable Isolation is similar to Repeatable Read Isolation but the
difference is it prevents Phantom Read. This works based on range lock. If
table has index then it locks records based on index range used in WHERE
clause(like where ID between 1 and 3). If table doesn't have index then it
locks complete table.
Serializable Example 1
Assume table does not have index column.
Session 1
Output
Result in Session 1.
Complete Emp table will be locked during the transaction in Session 1. Unlike
"Repeatable Read", insert query in Session 2 will wait till session 1 execution
is completed. Hence Phantom read is prevented and both queries in session 1
will display same number of rows.
Serializable Example 2
Assume table has primary key on column "ID". In our example script, primary
key is not added. Add primary key on column Emp.ID before executing below
examples.
Session 1
Output
Since Session 1 is filtering IDs between 1 and 3, only those records whose IDs
range between 1 and 3 will be locked and these records can not be modified
and no new records with ID range between 1 to 3 will be inserted. In this
example, new record with ID=11 will be inserted in Session 2 without any
delay.
Snapshot
Snapshot isolation is similar to Serializable isolation. The difference is
Snapshot does not hold lock on table during the transaction so table can be
modified in other sessions. Snapshot isolation maintains versioning in
Tempdb for old data in case of any data modification occurs in other sessions
then existing transaction displays the old data from Tempdb.
Snapshot Example 1
Session 1
Session 2
Output
Result in Session 1.
Result in Session 2.