Home » SQL Server » Database Concurrency: MVCC in PostgreSQL vs Row Versioning in SQL Server

Database Concurrency: MVCC in PostgreSQL vs Row Versioning in SQL Server

What is Concurrency in Databases?

Concurrency control ensures that multiple transactions can occur simultaneously without leading to data inconsistency. Two popular concurrency control mechanisms are:

  • MVCC (Multi-Version Concurrency Control) – used by PostgreSQL
  • Row Versioning – used by databases like SQL Server and Oracle

MVCC in PostgreSQL

PostgreSQL uses MVCC to handle concurrent transactions without locking rows for reads. Instead of overwriting data, it creates a new version of a row for every update. Each row has two hidden fields:

  • xmin: ID of the transaction that created the row
  • xmax: ID of the transaction that deleted the row (if any)

Benefits:

  • Readers never block writers
  • Writers never block readers
  • Snapshot isolation ensures consistent reads

Row Versioning (e.g., SQL Server)

Row versioning also maintains multiple versions of a row, but it stores them in a version store (usually in tempdb). It’s used in Read Committed Snapshot Isolation (RCSI) and Snapshot Isolation.

Benefits:

  • Reduces locking and blocking
  • Enables consistent reads without shared locks

Key Differences

FeaturePostgreSQL (MVCC)SQL Server (Row Versioning)
Version StorageIn the table itselfIn a separate version store
Hidden Columnsxmin, xmaxNot exposed to users
Vacuuming RequiredYes (to clean old versions)No (handled by version store)
Default Isolation LevelRead Committed (MVCC)Read Committed (locking)
Snapshot Isolation SupportYesYes (optional)

Sample Script: MVCC in PostgreSQL

Here’s a simple example to demonstrate MVCC behavior:

-- Session 1
BEGIN;
SELECT * FROM employees WHERE id = 1;

-- Session 2 (in parallel)
BEGIN;
UPDATE employees SET salary = salary + 1000 WHERE id = 1;
COMMIT;

-- Back to Session 1
SELECT * FROM employees WHERE id = 1;
COMMIT;

What Happens:

  • Session 1 sees the original data even after Session 2 commits.
  • This is because Session 1 is working with a snapshot of the data taken at the beginning of its transaction.

Sample Script: Row Versioning in SQL Server

-- Enable RCSI
ALTER DATABASE YourDB SET READ_COMMITTED_SNAPSHOT ON;

-- Session 1
BEGIN TRAN;
SELECT * FROM employees WHERE id = 1;

-- Session 2
BEGIN TRAN;
UPDATE employees SET salary = salary + 1000 WHERE id = 1;
COMMIT;

-- Back to Session 1
SELECT * FROM employees WHERE id = 1;
COMMIT;

What Happens:

  • Session 1 reads the old version of the row from the version store.
  • No blocking occurs between reads and writes.

Conclusion
Both MVCC and Row Versioning aim to improve concurrency and reduce locking, but they differ in implementation. PostgreSQL’s MVCC is tightly integrated into its storage engine, while SQL Server uses a separate version store. Understanding these mechanisms helps in designing high-performance, concurrent applications.

#MVCC, #RowVersioning, #PostgreSQL, #SQLServer, #DatabaseConcurrency, #SQLTutorial, #BackendDevelopment, #DatabaseDesign, #SnapshotIsolation, #ConcurrencyControl, #PostgreSQLMVCC, #SQLServerTips, #DatabasePerformance, #TechExplained, #SQLIsolationLevels, #MVCCvsRowVersioning, #PostgreSQLvsSQLServer, #DatabaseArchitecture, #SQLLearning, #DatabaseInternals, #SQLConcurrency, #DataEngineering, #SoftwareDevelopment, #TechEducation, #LearnSQL

Leave a Reply

Join us on Facebook

microsoftcommunitycontributor