数据库锁

任何事务无论其隔离级别如何,都具有原子性。原子性和隔离级别是两码事。
假定只有一种资源数据表上的“行“可以被锁定。锁只有共享锁和排他锁两种。
锁的兼容性:
  SX
S 10
X 00

事务的隔离级别:
Read Uncommitted
数据读取时不需要锁定
Read Committed
数据读取时需要共享锁定
Repeatable Read
数据读取时需要排他锁
Serializable
事务必须等同于串行执行

注意无论任何时候更新行都必须要有排他锁。
插入行不需要锁。
在Read Committed隔离级别下,数据读取完毕后立即释放共享锁,而在Repeatable Read隔离级别下,事务保持共享

锁直到整个事务结束。

在SQL Server中调整事务隔离级别是针对会话的,set tran isolation level后,会话中后来开始的事务都在此隔

离级别上执行。一个事务只能具有一个隔离级别。同一会话中的所有事务必须串行执行。必须通过begin tran语句来覆盖默认事务范围。

 

测试:

 /*环境*/

CREATE TABLE [dbo].[TranTest](
 [Id] [int] IDENTITY(1,1) NOT NULL,
 [count1] [int] NULL,
 [count2] [int] NULL
)

insert into TranTest values(1,2)
insert into TranTest values(3,4)
insert into TranTest values(5,6)
insert into TranTest values(7,8)

 

 

约定总是先执行session1,并且在session1结束前执行session2
1. 排他锁总是在事务结束时释放

 

--session 1

set tran isolation level any
begin tran
 update TranTest set count1=count1 + 10 where id=1
 waitfor delay '00:00:10'
commit tran


--session 2

 select * from TranTest

现象:session2被阻塞直到session1中的会话结束。

解释:session1首先执行,更新id=1的行时持有了该行的排他锁,该锁直到session1中的事务结束时释放,这阻止

了session2获得共享锁。


2. 读未提交无需任何锁

--session 1

set tran isolation level any
begin tran
 update TranTest set count1=count1 + 10 where id=1
 waitfor delay '00:00:10'
commit tran

--session 2

set tran isolation level read uncommitted
begin tran
 select * from TranTest
commit tran

现象:session2未被阻塞,而是读取到了session1尚未提交的数据。
解释:读未提交无需锁定,因而绕开了锁定机制。


3. 死锁

--session 1

set tran isolation level read committed
begin tran
 update TranTest set count1=1000 where id=1
 waitfor delay '00:00:10'
 update TranTest set count1=1000 where id=2
commit tran

--session 2

set tran isolation level read committed
begin tran
 update TranTest set count1=2000 where id=2
 waitfor delay '00:00:10'
 update TranTest set count1=2000 where id=1
commit tran

现象:发生死锁,有一个事务被强制终止。
解释:session1持有了id=1的行的排他锁,等待id=2的行的排他锁;session2持有了id=2的行的排他锁,等待id=1

的行排他锁。从逻辑上说这样是会造成死锁的,但实际上在sql server中这种情况也很有可能不会导致死锁。这

是sql server死锁检测程序的功劳。当它预测到死锁可能发生的时候,可能会悬挂一个事务,等待另一个执行完成

posted @ 2012-10-07 22:34  bobsoft  阅读(211)  评论(0编辑  收藏  举报