ตกลงกลับบ้านแล้วทดสอบ นี่คือการสังเกต
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
การทดสอบครั้งแรกกับการตั้งค่าทั้งสองยืนยันว่าปิด
แบบสอบถาม 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 แสดงให้เห็นว่าล็อคแบบเอกสิทธิ์เฉพาะบุคคลใน Table1 ที่เกิดขึ้นจากแบบสอบถาม 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 แต่ให้ปิด ALLOW_SNAPSHOT_ISOLATION
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO
เรียกใช้ Query 1 และเรียกใช้แบบสอบถาม 2 DMV แสดงแบบสอบถาม 1 มีการล็อกแบบเอกสิทธิ์เฉพาะบุคคล แต่แบบสอบถาม 2 ส่งกลับรายละเอียดด้วย 'ดั้งเดิม' โดยไม่มีแบบสอบถาม 1 ยอมรับธุรกรรม ปรากฏว่ามีการกำหนดเวอร์ชันแถว READ_COMMITTED
การเพิ่มSET TRANSACTION ISOLATION LEVEL SNAPSHOT;
ในแบบสอบถาม 1 และแบบสอบถาม 2 และเรียกใช้แบบสอบถาม 1 หรือแบบสอบถาม 2 ส่งคืนข้อผิดพลาด - ธุรกรรมแยก Snapshot ล้มเหลวในการเข้าถึงฐานข้อมูล 'ทดสอบ' เนื่องจากไม่อนุญาตให้มีการแยกสแนปชอตในฐานข้อมูลนี้ ใช้ ALTER DATABASE เพื่ออนุญาตการแยกสแน็ปช็อต
การทดสอบที่สามย้อนกลับการทำธุรกรรมก่อนหน้า ตั้งค่า READ_COMMITTED_SNAPSHOT OFF และเปิด ALLOW_SNAPSHOT_ISOLATION
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 ON ไม่ปรากฏขึ้นเพื่อเปิดใช้งานการกำหนดเวอร์ชัน READ COMMITTED แถว
การเพิ่มSET TRANSACTION ISOLATION LEVEL SNAPSHOT;
ทั้งคิวรี 1 และคิวรี 2 เรียกใช้คิวรี 1 และคิวรี 2 ในขณะที่ DMV แสดงคิวรี 1 ที่มีการล็อกแบบเอกสิทธิ์เฉพาะบุคคลนั้นคิวรี 2 จะส่งกลับรายละเอียดด้วย 'ดั้งเดิม' ดูเหมือนจะมีการแยกสแนปชอต
การสังเกตจากการทดสอบแสดงให้เห็นว่าREAD_COMMITTED_SNAPSHOT
ตัวเองเปิดใช้งาน / ปิดใช้งานการกำหนดเวอร์ชัน READ COMMITTED แถวโดยไม่คำนึงถึงALLOW_SNAPSHOT_ISOLATION
การตั้งค่าและในทางกลับกัน