6.1. TRANSACTIONS6.1.1. Atomic6.1.2. Consistent6.1.3. Isolated6.1.4. Durable6.2. CONSEQUENCE OF CONCURRENT ACCESS6.2.1. Lost Updates6.2.2. Dirty Reads6.2.3. Non-Repeatable Reads6.2.4. Phantom Reads6.2.5. Double Reads6.2.6. Halloween Effect6.3. LOCKING6.3.1. Viewing Locks — sys.dm_tran_locks6.3.2. Lock Granularity6.3.3. Lock Modes6.3.3.1. Shared Lock Mode (S)6.3.3.2. Update Lock Mode (U)6.3.3.3. Exclusive Lock Mode (X)6.3.3.4. Schema Lock Modes (Sch-S), (Sch-M)6.3.3.5. Intent Lock Modes (IS), (IU), (IX)6.3.3.6. Conversion Lock Modes (SIX), (SIU), (UIX)6.3.3.7. Bulk Update Lock Mode (BU)6.3.4. Lock Hierarchy6.3.5. Lock Compatibility6.3.6. Lock Escalation6.3.6.1. Controlling Lock Escalation6.3.6.2. Detecting Lock Escalation6.3.7. Deadlocking6.4. PESSIMISTIC CONCURRENCY6.4.1. Pessimistic Isolation Levels6.4.1.1. Read Uncommitted6.4.1.2. Read Committed6.4.1.3. Repeatable Read6.4.1.4. Serializable6.4.2. Concurrency vs. Isolation6.5. OPTIMISTIC CONCURRENCY6.5.1. Optimistic Isolation Levels6.5.1.1. Read Committed Snapshot Isolation6.5.1.2. Snapshot Isolation6.5.1.3. The Snapshot Achilles Heel — Update Conflicts6.5.1.4. Other Limitations of Snapshot Isolation6.5.2. How Row Versioning Works6.5.3. Row Versioning Deep Dive6.5.3.1. Reading the XSN and Pointer6.5.3.2. Rogue Transaction6.5.3.3. Garbage Collection6.5.4. Monitoring Row Versioning6.5.4.1. sys.dm_tran_top_version_generators6.6. LATCHES6.6.1. Latch Types6.6.1.1. Non-Buffer (Non-BUF) Latches6.6.1.2. Buffer (BUF) Latches6.6.1.3. IO (BUF) Latches6.6.2. BUF Latch Architecture6.6.2.1. Buffer Manager6.6.2.2. Hash Table6.6.2.3. Buffer6.6.2.4. BUF Arrays and BUF Structures6.6.2.5. Data Pages6.6.3. Latch Modes6.6.3.1. Keep (KP) Latch6.6.3.2. Shared (SH) Latch6.6.3.3. Update (UP) Latch6.6.3.4. Exclusive (EX) Latch6.6.3.5. Destroy (DT) Latch6.6.4. Grant Order6.6.5. Latch Waits and Blocking6.7. SUB-LATCHES AND SUPER-LATCHES6.8. LATCHING IN ACTION6.8.1. Without Latching6.8.2. With Latching6.9. SUMMARY