SQL Practice Logo

SQLPractice Online

Database System Fundamentals: Examples

Module: Database-Specific Features

MVCC Transaction Processing - Non-Blocking Reads

intermediate

PostgreSQL uses MVCC (multi-version concurrency control) to allow readers and writers to work simultaneously without blocking. When a transaction updates a row, PostgreSQL keeps the old version for concurrent readers. This enables high-concurrency workloads like Uber ride matching (50K writes/sec, zero blocking reads).

-- Setup: Create users table

CREATE TABLE users (

user_id INT PRIMARY KEY,

name VARCHAR(100),

balance DECIMAL(10,2),

updated_at TIMESTAMP

);

INSERT INTO users VALUES

(1, 'Alice', 1000.00, NOW()),

(2, 'Bob', 500.00, NOW());

-- Transaction 1: Long-running read (analytics)

BEGIN;

SELECT user_id, name, balance

FROM users

WHERE balance > 0;

-- Result: Alice: $1000, Bob: $500

-- Transaction sees snapshot at BEGIN time

-- Runs for 10 seconds (complex analytics)

-- Transaction 2: Update (concurrent, doesn't wait)

BEGIN;

UPDATE users

SET balance = balance - 100,

updated_at = NOW()

WHERE user_id = 1;

-- Creates new row version: Alice: $900

-- Old version kept: Alice: $1000

-- Commits immediately (doesn't block Transaction 1)

COMMIT;

-- Transaction 1: Read again (still sees old data)

SELECT user_id, name, balance

FROM users

WHERE balance > 0;

-- Result: Alice: $1000, Bob: $500 (unchanged)

-- Still sees snapshot from BEGIN time

-- Not blocked by Transaction 2's update

COMMIT;

-- New transaction: Sees latest data