好的,回到家进行测试。这是观察结果。
CREATE DATABASE TEST;
GO
CREATE TABLE TABLE1
(
ID tinyint,
Details varchar(10)
);
GO
INSERT INTO TABLE1
VALUES (1, 'Original');
GO
SELECT
name,
snapshot_isolation_state_desc,
is_read_committed_snapshot_on
FROM sys.databases
WHERE name = 'TEST';
GO
两项设置均确认为OFF的第一次测试。
查询1
USE TEST;
BEGIN TRAN
UPDATE TABLE1
SET Details = 'Update'
WHERE ID = 1;
--COMMIT;
--ROLLBACK;
GO
查询2
USE TEST;
SELECT ID, Details
FROM TABLE1
WHERE ID = 1;
GO
在此测试中,查询2正在等待查询1提交,dm_tran_locks DMV显示查询1在表1上引起的排他锁。
USE TEST;
SELECT
DB_NAME(tl.resource_database_id) AS DBName,
resource_type,
OBJECT_NAME(resource_associated_entity_id) AS tbl_name,
request_mode,
request_status,
request_session_id
FROM sys.dm_tran_locks tl
WHERE
resource_database_id = db_id('TEST')
AND resource_type = 'OBJECT'
第二项测试,回滚上一个事务,将READ_COMMITTED_SNAPSHOT设置为ON,但将ALLOW_SNAPSHOT_ISOLATION设置为OFF。
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO
运行查询1,然后运行查询2。DMV显示查询1产生了排他锁,但是查询2返回带有“原始”的详细信息,而没有查询1提交事务。似乎已完成READ_COMMITTED行版本控制。
添加SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
上查询1和查询2,和运行查询1或2的查询将返回错误-因为快照隔离未在此数据库允许快照隔离事务未能访问数据库“test”。使用ALTER DATABASE允许快照隔离。
第三次测试,回滚先前的事务。将READ_COMMITTED_SNAPSHOT设置为OFF,将ALLOW_SNAPSHOT_ISOLATION设置为ON。
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT OFF
WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE TEST
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
运行查询1,然后查询2。DMV显示查询1引起的排他锁。查询2似乎正在等待查询1完成。似乎没有打开ALLOW_SNAPSHOT_ISOLATION来启用READ COMMITTED行版本控制。
同时添加SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
到查询1和查询2。运行查询1,然后查询2。虽然DMV显示查询1产生互斥锁,但查询2返回带有“原始”的详细信息。快照隔离似乎已就绪。
从测试中观察到的结果表明,READ_COMMITTED_SNAPSHOT
无论ALLOW_SNAPSHOT_ISOLATION
设置如何,它本身都启用/禁用READ COMMITTED行版本控制,反之亦然。