Oke, pulang dan diuji. Inilah pengamatannya.
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
Tes pertama dengan kedua pengaturan dikonfirmasi OFF.
Pertanyaan 1
USE TEST;
BEGIN TRAN
UPDATE TABLE1
SET Details = 'Update'
WHERE ID = 1;
--COMMIT;
--ROLLBACK;
GO
Pertanyaan 2
USE TEST;
SELECT ID, Details
FROM TABLE1
WHERE ID = 1;
GO
Dalam pengujian ini, permintaan 2 sedang menunggu permintaan 1 untuk melakukan, dm_tran_locks DMV menunjukkan bahwa kunci eksklusif pada TABLE1 yang dikeluarkan oleh permintaan 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'
Tes kedua , kembalikan transaksi sebelumnya, setel READ_COMMITTED_SNAPSHOT ON tetapi biarkan ALLOW_SNAPSHOT_ISOLATION OFF.
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO
Jalankan Kueri 1, dan jalankan kueri 2. DMV menampilkan kueri 1 mengeluarkan kunci eksklusif, tetapi kueri 2 mengembalikan detail dengan 'Asli' tanpa kueri 1 melakukan transaksi. Tampaknya READ_COMMITTED versi baris sudah ada.
Menambahkan SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
kueri 1 dan kueri 2, dan menjalankan kueri 1 atau kueri 2 mengembalikan kesalahan - Transaksi isolasi snapshot gagal mengakses database 'TEST' karena isolasi snapshot tidak diperbolehkan dalam database ini. Gunakan ALTER DATABASE untuk memungkinkan isolasi snapshot.
Tes ketiga , kembalikan transaksi sebelumnya. Setel OFF READ_COMMITTED_SNAPSHOT dan 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
Jalankan kueri 1, lalu kueri 2. DMV memperlihatkan kunci eksklusif yang ditimbulkan oleh kueri 1. Kueri 2 tampaknya menunggu kueri 1 selesai. Menghidupkan ALLOW_SNAPSHOT_ISOLATION ON tampaknya tidak mengaktifkan READ COMMITTED versi baris.
Menambahkan SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
ke kueri 1 dan kueri 2. Jalankan kueri 1 dan kemudian kueri 2. Sementara DMV menunjukkan kueri 1 mengeluarkan kunci eksklusif, kueri 2 mengembalikan detail dengan 'Asli'. Isolasi snapshot tampaknya ada di tempatnya.
Pengamatan dari tes menunjukkan bahwa READ_COMMITTED_SNAPSHOT
itu sendiri mengaktifkan / menonaktifkan versi baris READ COMMITTED terlepas dari ALLOW_SNAPSHOT_ISOLATION
pengaturan, dan sebaliknya.