Reference · Database · SQL Server 2022 (tanpa optimized locking)

Transaction, isolation level, locking, deadlock

Ringkasan satu halaman. Dari Lesson 0021. Skrip lab: dotnet/lab/0021-sesi-a.sql + dotnet/lab/0021-sesi-b.sql (dua jendela).

ACID [1]

Pola T-SQL [2] [3] [4]

SET XACT_ABORT ON;                          -- default OFF (ON di trigger)
BEGIN TRY
    BEGIN TRANSACTION;
        UPDATE dbo.Product SET Stock = Stock - 5 WHERE Id = 1;
        UPDATE dbo.Product SET Stock = Stock + 5 WHERE Id = 2;
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;  -- 1 aktif, -1 uncommittable (hanya ROLLBACK), 0 tidak ada
    THROW;
END CATCH;

EF Core [5]

// Satu SaveChanges = satu transaction (default). Beberapa SaveChanges:
await using var tx = await context.Database.BeginTransactionAsync(IsolationLevel.ReadCommitted);
await context.SaveChangesAsync();
await context.SaveChangesAsync();
await tx.CommitAsync();                     // exception → rollback saat dispose

Isolation level [1] [6]

LevelDirtyNon-repeatablePhantomMekanisme
READ UNCOMMITTEDbisabisabisatanpa S lock (= NOLOCK)
READ COMMITTED (default)–bisabisaS lock dilepas setelah baca
REPEATABLE READ––bisaS lock sampai akhir transaction
SNAPSHOT–––versi saat transaction mulai; konflik → 3960
SERIALIZABLE–––key-range lock

Lock dan blocking [1]

Diminta ↓ / dipegang →SUX
S (baca)okoktunggu
U (cari-untuk-ubah)oktunggutunggu
X (ubah)tunggutunggutunggu
SELECT session_id, blocking_session_id, wait_type, wait_time, wait_resource
FROM sys.dm_exec_requests WHERE blocking_session_id <> 0;          -- siapa diblok siapa
SELECT request_session_id, resource_type, request_mode, request_status
FROM sys.dm_tran_locks WHERE resource_database_id = DB_ID();       -- GRANTED / WAIT

Kedua DMV butuh VIEW SERVER PERFORMANCE STATE di SQL Server 2022. [8] [9]

Deadlock [7]

Jawaban 60–90 detik

Isolation level mengatur perilaku membaca: READ UNCOMMITTED (dirty read), READ COMMITTED default (cegah dirty read), REPEATABLE READ (cegah non-repeatable read lewat S lock sampai akhir), SERIALIZABLE (cegah phantom lewat range lock), SNAPSHOT (row versioning, pembaca tidak memblok penulis, bisa konflik 3960). Level lebih tinggi = lebih banyak blocking dan deadlock. Saya pakai READ COMMITTED, idealnya RCSI. Deadlock = siklus saling menunggu; engine memilih victim dan mengirim 1205. Cegah dengan urutan akses sama dan transaction pendek; tangani dengan retry 1205.

Sumber: [1] Transaction locking and row versioning guide · [2] SET XACT_ABORT · [3] XACT_STATE · [4] BEGIN TRANSACTION · [5] EF Core: Transactions · [6] SET TRANSACTION ISOLATION LEVEL · [7] Deadlocks guide · [8] sys.dm_exec_requests · [9] sys.dm_tran_locks · [10] EF Core: Connection resiliency · [11] EF Core: Concurrency conflicts · [12] SET LOCK_TIMEOUT · [13] MSSQLSERVER_1222