Labels

admin (1) aix (1) alert (1) always-on (2) Architecture (1) aws (3) Azure (1) backup (3) BI-DWH (10) Binary (3) Boolean (1) C# (1) cache (1) casting (3) cdc (1) certificate (1) checks (1) cloud (3) cluster (1) cmd (7) collation (1) columns (1) compilation (1) configurations (7) Connection-String (2) connections (6) constraint (6) copypaste (2) cpu (2) csv (3) CTE (1) data-types (1) datetime (23) db (547) DB2 (1) deadlock (2) Denali (7) device (6) dotNet (5) dynamicSQL (11) email (5) encoding (1) encryption (4) errors (124) excel (1) ExecutionPlan (10) extended events (1) files (7) FIPS (1) foreign key (1) fragmentation (1) functions (1) GCP (2) gMSA (2) google (2) HADR (1) hashing (3) in-memory (1) index (3) indexedViews (2) insert (3) install (10) IO (1) isql (6) javascript (1) jobs (11) join (2) LDAP (2) LinkedServers (8) Linux (15) log (6) login (1) maintenance (3) mariadb (1) memory (4) merge (3) monitoring (4) MSA (2) mssql (444) mssql2005 (5) mssql2008R2 (20) mssql2012 (2) mysql (36) MySQL Shell (5) network (1) NoSQL (1) null (2) numeric (9) object-oriented (1) offline (1) openssl (1) Operating System (4) oracle (7) ORDBMS (1) ordering (2) Outer Apply (1) Outlook (1) page (1) parameters (2) partition (1) password (1) Performance (103) permissions (10) pivot (3) PLE (1) port (4) PostgreSQL (14) profiler (1) RDS (3) read (1) Replication (12) restore (4) root (1) RPO (1) RTO (1) SAP ASE (48) SAP RS (20) SCC (4) scema (1) script (8) security (10) segment (1) server (1) service broker (2) services (4) settings (75) SQL (74) SSAS (1) SSIS (19) SSL (8) SSMS (4) SSRS (6) storage (1) String (35) sybase (57) telnet (2) tempdb (1) Theory (2) tips (120) tools (3) training (1) transaction (6) trigger (2) Tuple (2) TVP (1) unix (8) users (3) vb.net (4) versioning (1) windows (14) xml (10) XSD (1) zip (1)

SQL Server : Row Versioning-based Isolation Levels - Read_Committed_Snapshot

--An user began a transaction and update few records in a table and won't commit that transaction.
--The user of this session can see the updated uncommited records of this table.

Begin Tran
Update StamTable Set asdsadsad = 999 where asdsadsad is not null

--------------------------------------------------------

--About users from other sessions:

Alter Database ItaiDWSource Set Read_Committed_Snapshot Off
Go
-- Other session won't get result from the table until the lock will be release or transaction will be commit or rollback.
-- The query will be Stuck!
Select * From StamTable
GO
-- also in those queries:
Select * From StamTable With (ReadCommitted) where asdsadsad is not null;
GO 
Select * From StamTable where asdsadsad is not null;
GO
-- but, in those queries, we will get the updated uncommited records, and we won't be Stuck.
Select * From StamTable With (NoLock) where asdsadsad is not null;
GO 
Select * From StamTable With (ReadUnCommitted) where asdsadsad is not null;
GO
-- NOTE: the risk is, that maybe the transaction will be rollback


Alter Database ItaiDWSource Set Read_Committed_Snapshot on
Go
-- NO query will be Stuck!
-- In those queries we will get the last updated version of the data (before the update query):
Select * From StamTable
GO
Select * From StamTable With (ReadCommitted) where asdsadsad is not null;
GO 
Select * From StamTable where asdsadsad is not null;
GO
-- but, in those queries, we will get the updated uncommited records:
Select * From StamTable With (NoLock) where asdsadsad is not null;
GO 
Select * From StamTable With (ReadUnCommitted) where asdsadsad is not null;
GO
-- the risk is, that maybe the transaction will be rollback


Read_Committed_Snapshot (RCSI) isolation level:
RCSI save a version to changed data in order to prevent from waits for uncommitted transactions.
RCSI goal is to reduce blocking and deadlocking issues caused by lock contention.

When using RCSI:
  • Readers DO NOT block Writers.
  • Writers DO NOT block Readers.
  • Writers DO block Writers.
Advantages:
  • SELECT statements do not lock data during a read operation.
  • As written above, RCSI can reduce blocking and deadlocking issues caused by lock contention.
  • --> Can improve performance.
  • Read operations retrieve a consistent snapshot of the database and not uncommitted version (not like in READ UNCOMMITTED that retrieve a not-consistent snapshot).
Disadvantages:


Read committed
Read uncommitted
RCSI

Yes
No
No
Locks while SELECT
No
Yes
No
Corrupted Data
Yes
No
No
The most updated data
Wait for commit\rollback
Get the current (and maybe the dirty) data in the table, before commit\rollback.
Get the last updated version of the data (before the first transaction)
In case of change in transaction, and in another transaction there is a Select on the updated data
Yes
Yes
Yes
Locks while UPDATE


-- Get the Read_Committed_Snapshot status:
Select name, is_read_committed_snapshot_on
From sys.databases Where database_id = DB_ID()
-- On = 1, Off = 0

No comments:

Post a Comment