From 045b89c82f0f5b0cfc3c8479c1bf15234b8f415b Mon Sep 17 00:00:00 2001 From: Nikhil Bhargava Date: Sun, 29 Jun 2025 19:32:15 +0530 Subject: [PATCH 1/2] SQL-472: Types of Locks in SQL Server --- sql-constraints/sql-locks/sqlserver-locks.sql | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 sql-constraints/sql-locks/sqlserver-locks.sql diff --git a/sql-constraints/sql-locks/sqlserver-locks.sql b/sql-constraints/sql-locks/sqlserver-locks.sql new file mode 100644 index 00000000..c7947dac --- /dev/null +++ b/sql-constraints/sql-locks/sqlserver-locks.sql @@ -0,0 +1,138 @@ +-- Change schema to University +USE University; + +--Shared Lock (S) + +--Session 1 +-- Set the isolation level to REPEATABLE READ to hold shared locks until commit/rollback +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; + +BEGIN TRAN; +SELECT * +FROM Course +WHERE id='CS111'; + +--Check the locks held by this session: +SELECT request_session_id, resource_type, resource_description, request_mode, resource_associated_entity_id +FROM sys.dm_tran_locks +WHERE request_session_id = @@SPID; + +--Commit later +COMMIT TRAN; + +--Session 2 +SELECT * +FROM Course +WHERE id='CS111'; + +BEGIN TRAN; + +UPDATE Course +SET credits = 8 +WHERE id='CS111'; + +ROLLBACK TRAN; + +--Sesion 3 +SELECT + session_id, + blocking_session_id, + command, + status, + wait_type, + wait_time, + last_wait_type, + open_transaction_count, + text +FROM sys.dm_exec_requests +CROSS APPLY sys.dm_exec_sql_text(sql_handle) +WHERE blocking_session_id <> 0; + +--EXEC sp_who2; + +--Exclusive Lock (X) + +--Session 1 + +-- Set the isolation level to REPEATABLE READ to hold shared locks until commit/rollback +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; + +BEGIN TRAN; +UPDATE Course +SET credits = 8 +WHERE id='CS111'; + +--Check the locks held by this session: +SELECT request_session_id, resource_type, resource_description, request_mode, resource_associated_entity_id +FROM sys.dm_tran_locks +WHERE request_session_id = @@SPID; + +--Rollback later +ROLLBACK TRAN; + +--Session 2 +BEGIN TRAN; +SELECT * +FROM Course +WHERE id='CS111'; + +COMMIT TRAN; + + +--Update Lock (U) + +--Session 1 +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; + +BEGIN TRAN; +SELECT * +FROM Course +WITH (UPDLOCK) +WHERE id='CS111'; + +--Check the locks held by this session: +SELECT request_session_id, resource_type, resource_description, request_mode +FROM sys.dm_tran_locks +WHERE request_session_id = @@SPID; + +--Session 2 +SELECT * +FROM Course +WHERE id='CS111'; + +UPDATE Course +SET credits = 8 +WHERE id='CS111'; + +--Shared with Intent Exclusive (SIX) + +--Session 1 +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; + +BEGIN TRAN; + +-- Explicitly request a SIX lock: +SELECT * +FROM Course +WITH (TABLOCKX, HOLDLOCK) +WHERE id='CS111'; + +UPDATE Course +SET credits = 8 +WHERE id='CS111'; + +--Rollback later +ROLLBACK TRAN; + +SELECT request_session_id, resource_type, resource_description, request_mode +FROM sys.dm_tran_locks +WHERE request_session_id = @@SPID; + +--Session 2 +BEGIN TRAN; + +SELECT * +FROM Course +WHERE id='CS111'; + +COMMIT TRAN; \ No newline at end of file From 27cc61cf81128846dfd3ccb87463fd1f5ed8c31f Mon Sep 17 00:00:00 2001 From: Nikhil Bhargava Date: Mon, 7 Jul 2025 13:31:39 +0530 Subject: [PATCH 2/2] SQL-472: Types of Locks in SQL Server --- .../sql-locks/sqlserver-locks.sql | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 sql-transactions/sql-locks/sqlserver-locks.sql diff --git a/sql-transactions/sql-locks/sqlserver-locks.sql b/sql-transactions/sql-locks/sqlserver-locks.sql new file mode 100644 index 00000000..a95b5e94 --- /dev/null +++ b/sql-transactions/sql-locks/sqlserver-locks.sql @@ -0,0 +1,134 @@ +-- Change schema to University +USE University; + +--Shared Lock (S) + +--Session 1 +-- Set the isolation level to REPEATABLE READ to hold shared locks until commit/rollback +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; + +BEGIN TRAN; +SELECT id, name, credits +FROM Course +WHERE id='CS111'; + +--Check the locks held by this session: +SELECT request_session_id, resource_type, request_mode +FROM sys.dm_tran_locks +WHERE request_session_id = @@SPID +AND resource_type = 'KEY'; + +--Commit later +COMMIT TRAN; + +--Session 2 +SELECT id, name, credits +FROM Course +WHERE id='CS111'; + +BEGIN TRAN; + +UPDATE Course +SET credits = 8 +WHERE id='CS111'; + +ROLLBACK TRAN; + +--Sesion 3 +SELECT + session_id, + blocking_session_id, + command, + status +FROM sys.dm_exec_requests +CROSS APPLY sys.dm_exec_sql_text(sql_handle) +WHERE blocking_session_id <> 0; + +--EXEC sp_who2; + +--Exclusive Lock (X) + +--Session 1 + +-- Set the isolation level to REPEATABLE READ to hold shared locks until commit/rollback +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; + +BEGIN TRAN; +UPDATE Course +SET credits = 8 +WHERE id='CS111'; + +--Check the locks held by this session: +SELECT request_session_id, resource_type, request_mode +FROM sys.dm_tran_locks +WHERE request_session_id = @@SPID; + +--Rollback later +ROLLBACK TRAN; + +--Session 2 +BEGIN TRAN; +SELECT id, name, credits +FROM Course +WHERE id='CS111'; + +COMMIT TRAN; + + +--Update Lock (U) + +--Session 1 +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; + +BEGIN TRAN; +SELECT id, name, credits +FROM Course +WITH (UPDLOCK) +WHERE id='CS111'; + +--Check the locks held by this session: +SELECT request_session_id, resource_type, request_mode +FROM sys.dm_tran_locks +WHERE request_session_id = @@SPID; + +--Session 2 +SELECT id, name, credits +FROM Course +WHERE id='CS111'; + +UPDATE Course +SET credits = 8 +WHERE id='CS111'; + +--Shared with Intent Exclusive (SIX) + +--Session 1 +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; + +BEGIN TRAN; + +-- Explicitly request a SIX lock: +SELECT id, name, credits +FROM Course +WITH (TABLOCKX, HOLDLOCK) +WHERE id='CS111'; + +UPDATE Course +SET credits = 8 +WHERE id='CS111'; + +--Rollback later +ROLLBACK TRAN; + +SELECT request_session_id, resource_type, request_mode +FROM sys.dm_tran_locks +WHERE request_session_id = @@SPID; + +--Session 2 +BEGIN TRAN; + +SELECT * +FROM Course +WHERE id='CS111'; + +COMMIT TRAN; \ No newline at end of file