我正在使用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中打开时,我得到了死锁。有人告诉我为什么可重复读取不起作用并且表现得像读取提交。
答案 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