SQL2005的锁定与交易隔离级别

交易的隔离级别:当激活交易时,控制交易内因SQL语句产生的锁定有久,影响范围有多大。以防止多人访问时,在交易内发生数据查询的错误。设置的交易隔离级别将影响整条连接。

 

SQLSERVER交易的隔离级别:读取未认可(Read Uncommitted)、读取认可(Read Committed)、可重复读取(Repeatable Read)、快照、可串行化

 

设置语句:set transaction isolation level read committed

 

读取未认可

 

读取未认可为最低的交易隔离级别,查询时不放置共享锁就直接读取,所以,忽悠已存在的锁定。能加快查询速度,但会读到别人正在更新的数据。

 

测试数据:

新建一个连接,执行下面的sql语句,因为没有commit,rollback查询@@trancoun等于1,任有交易

use Northwind

go

create table TransactionTest

(

     id int,

     name varchar(50)

)

 

go

insert into TransactionTest values(1,'liuyu')

insert into TransactionTest values(2,'testname')

go

begin tran

update TransactionTest set name='updated' where id=2

select @@trancount

 

再新建一个连接,执行下面sql语句,

set transaction isolation level read uncommitted

select * from TransactionTest where id=2

 

查询结果

 

 

读取认可

 

读取认可是SQLSERER的默认隔离级别。当交易正在执行时读取数据时,数据库会设置共享锁防止其他交易修改数据。当读取完成时,自动释放共享锁定,其他交易就可修改数据。

当未启用数据行控制版本时,会锁定整张表。数据行控制版本默认为关闭。开启的脚本如下

alter database Northwind set READ_COMMITTED_SNAPSHOT on

开启后,查询数据不会锁定,数据为交易前已认可的数据

 

 

测试数据

use Northwind

go

create table TransactionTest

(

     id int,

     name varchar(50)

)

 

go

insert into TransactionTest values(1,'liuyu')

insert into TransactionTest values(2,'testname')

go

begin tran

update TransactionTest set name='updated' where id=2

select @@trancount

 

再新建一个连接,执行下面sql语句,

set transaction isolation level read committed

select * from TransactionTest where id=2

查询结果:查不出数据,因为锁定

 

posted @ 2013-03-27 23:31  虎头  阅读(341)  评论(0编辑  收藏  举报