设置事务隔离级别可重复读取给死锁

时间:2015-05-27 03:37:43

标签: sql-server-2008

我正在使用open transaction更新会话1中的一些记录 -

begin transaction
update aa
set name = 'harry1'
where name = 'harry'

如您所见,未发出提交/回滚事务。现在我尝试从另一个会话会话2中读取记录。

set transaction isolation level repeatable read
select * from aa

现在隔离级别 - 可重复读取应该给我与会话1中更新语句之前的相同旧值,应该是哈利而不是哈里1 ..如果我错了请纠正我。 但是当我尝试在会话2中读取记录而事务仍然在会话1中打开时,我得到了死锁。有人告诉我为什么可重复读取不起作用并且表现得像读取提交。

2 个答案:

答案 0 :(得分:1)

REPEATABLE READ与READ COMMITTED相同,但另外共享锁保留在事务持续时间内读取的行上。换句话说,在事务提交或回滚之前,任何读取的行都不能被另一个连接修改。

因此,您对会话2的查询正在等待会话1上的提交或回滚。

答案 1 :(得分:0)

在 begin tran 块中读取数据时,不允许更新其他事务,从而防止脏读。因此不会发生不可重复读取。提交发生后,并发进程允许对客户表进行更新。

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN TRAN
      --first read
      SELECT first_name, last_name from customer WHERE customer_id=5
      ---second read
      SELECT first_name, last_name from customer WHERE customer_id=5
COMMIT TRAN