下面是如何使用SET TRANSACTION ISOLATION LEVEL命令来为连接内使用的T-SQL语句设置默认的事务加锁行为。在同一时间只可以设置一个隔离级别,除非显式设置,否则隔离级别不会改变。SET TRANSACTION ISOLATION LEVEL允许你为特定的数据库连接修改加锁行为。此命令的语法如下:
SET TRANSACTION ISOLATION LEVEL
{READ UNCOMMITED
|READ COMMITED
|REPEATABLE READ
|SNAPSHOT
|SERIALIZABLE
}
1.使用SERIALIZABLE隔离级别来查询表中的内容。
use AdventureWorks
go
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
go
BEGIN TRAN
SELECT AddressTypeID,Name
FROM Person.AddressType
WHERE AddressTypeID BETWEEN 1 AND 6
2.在第二个查询容查看由SERIALIZABLE隔离级别生成的锁类型
SELECT resource_associated_entity_id,resource_type,
Request_mode,Request_session_id
FROM sys.dm_tran_locks
3.返回第一个查询窗口,执行下面的代码结束事务并移除锁
COMMIT TRAN
4.在第一个查询窗口中使用READ UNCOMMITED隔离级别来读取某个范围的行
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
go
BEGIN TRAN
SELECT AddressTypeid,Name
FROM person.addressType
WHERE AddresstypeID BETWEEN 1 AND 6
在第二个查询窗口执行下面的的查询查看READ UNCOMMITTED隔离级别的锁类型
SELECT resource_associated_entity_id,resource_type,
Request_mode,Request_session_id
FROM sys.dm_tran_locks
不像SERIALIZABLE隔离级别,READ UNCOMMITTED隔离级别不在Person .AddressType表的键上创建额外的锁。
返回到第一个执行READ UNCOMMITTED查询的查询编辑器,结束事务:
COPIMIT TRAN
5.使用SNAPSHOT隔离级别。
在第一个查询窗口执行下面的代码:
ALTER DATABASE AdventureWorks
SET ALLOW_SNAPSHOT_ISOLATION ON
GO
use AdventureWorks
go
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
SELECT CurrencyRateID,EndofdayRate
FROM Sales.CurrencyRate
WHERE CurrencyRateID = 8317
6.在第二个查询窗口中执行下面的代码:
USE AdventureWorks
go
UPDATE Sales.CurrencyRate
SET EndOfDayRate=1.00
WHERE CurrencyRateID=8317
返回到第一个查询编辑器,重新执行下面的查询:
SELECT CurrencyRateID,EndofdayRate
FROM Sales.CurrencyRate
WHERE CurrencyRateID = 8317
即使第二个查询编辑器的查询更新了行,该查询还是返回了和前面械同的结果。SELECT没有因为读取行而被阻塞,而UPDATE也没有被阻塞进行修改。
现在将提交这个事务并重新执行这个查询:
COMMIT TRAN
SELECT CurrencyRateID,EndofDayRate
FROM Sales.CurrencyRate
WHERE CurrencyRateID=8371