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
查询结果:查不出数据,因为锁定