1

在Repeatable Read Isolation Level中,它不会阻止其他事务将新行插入到当前事务中已选择的表中。我想知道 DELETE 或 UPDATE 查询出现时背后的理论?考虑以下我正在尝试解决的示例。

假设使用关系数据库管理系统 (RDBMS) 和严格的 2 阶段锁定方法来进行并发控制。

ID  Balance Name
1   12      A
2   18      B
10  100     C

下面的时序图显示了基于上述Customer表 T1 和 T2 的两个并发事务的执行,这两个事务都在REPEATABLE_READ 事务隔离级别上执行。

            T1                                  T2
SELECT * FROM Customer              |
WHERE Balance BETWEEN 10 AND 20;    |
                                    |       **QUERY X** 
                                    |       COMMIT; "
SELECT * FROM Customer              |
WHERE Balance BETWEEN 10 AND 20;    |

如果将以下 SQL 语句之一替换为T2 上的QUERY X而不是 INSERT 查询,是否会出现 Phantom 异常?证明你的答案。

  1. 更新客户设置余额 = 14 WHERE 余额 = 100;
  2. 从客户那里删除余额 = 12;

我是 DBMS 的新手,因此我非常感谢您提供帮助我更好地理解这些问题的友好解释。

4

1 回答 1

2

您可以自己轻松地进行测试。

设置

CREATE TABLE dbo.Customer
(
ID INT,
Balance INT,
Name CHAR(1)
)


INSERT INTO dbo.Customer
VALUES 
(1 ,  12   ,  'A'),
(2 ,  18   ,  'B'),
(10,  100  ,  'C');

连接 1(使事务保持打开状态)

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN TRAN

SELECT * FROM Customer            
WHERE Balance BETWEEN 10 AND 20;  

SELECT *
FROM sys.dm_tran_locks
WHERE request_session_id = @@SPID

可重复读取与已提交读取(锁定版本)不同,因为它保留与子句S匹配的行上的锁,WHERE而不是在读取行后立即释放它们。

针对的查询sys.dm_tran_locks表明它拥有两个与返回的两行匹配的 RID 锁。

上面的跟踪标志 1200 输出

表明它获得了三个行S锁并保持对符合过滤器条件的行的锁

Process 64 acquiring IS lock on OBJECT: 5:917578307:0  (class bit2000000 ref1) result: OK

Process 64 acquiring IS lock on PAGE: 5:1:256  (class bit2000000 ref0) result: OK

Process 64 acquiring S lock on RID: 5:1:256:0 (class bit2000000 ref0) result: OK

Process 64 acquiring S lock on RID: 5:1:256:1 (class bit2000000 ref0) result: OK

Process 64 acquiring S lock on RID: 5:1:256:2 (class bit2000000 ref0) result: OK

Process 64 releasing lock on RID: 5:1:256:2

如果您现在尝试使用另一个连接

DELETE FROM Customer WHERE Balance = 12;

你会看到这被原始事务持有的行锁阻塞了。请注意,当原始事务提交并释放其锁时,这最终会成功。

取消那个并尝试

UPDATE Customer SET Balance = 14 WHERE Balance = 100;

这立即成功。原始事务从未保留该S行上的锁,因为即使它被读取(由于缺少 on 索引Balance)它不符合该子句的条件,并且根据上面的输出WHERE释放了锁。releasing lock

于 2020-04-18T15:32:47.880 回答