<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >Concurrency Control</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REV="MADE" HREF="mailto:pgsql-docs@postgresql.org"><LINK REL="HOME" TITLE="PostgreSQL 8.0.11 Documentation" HREF="index.html"><LINK REL="UP" TITLE="The SQL Language" HREF="sql.html"><LINK REL="PREVIOUS" TITLE="Examining Index Usage" HREF="indexes-examine.html"><LINK REL="NEXT" TITLE="Transaction Isolation" HREF="transaction-iso.html"><LINK REL="STYLESHEET" TYPE="text/css" HREF="stylesheet.css"><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"><META NAME="creation" CONTENT="2007-02-02T03:57:22"></HEAD ><BODY CLASS="CHAPTER" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="5" ALIGN="center" VALIGN="bottom" >PostgreSQL 8.0.11 Documentation</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="top" ><A HREF="indexes-examine.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="10%" ALIGN="left" VALIGN="top" ><A HREF="indexes.html" >Fast Backward</A ></TD ><TD WIDTH="60%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="top" ><A HREF="performance-tips.html" >Fast Forward</A ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="top" ><A HREF="transaction-iso.html" ACCESSKEY="N" >Next</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="CHAPTER" ><H1 ><A NAME="MVCC" ></A >Chapter 12. Concurrency Control</H1 ><DIV CLASS="TOC" ><DL ><DT ><B >Table of Contents</B ></DT ><DT >12.1. <A HREF="mvcc.html#MVCC-INTRO" >Introduction</A ></DT ><DT >12.2. <A HREF="transaction-iso.html" >Transaction Isolation</A ></DT ><DD ><DL ><DT >12.2.1. <A HREF="transaction-iso.html#XACT-READ-COMMITTED" >Read Committed Isolation Level</A ></DT ><DT >12.2.2. <A HREF="transaction-iso.html#XACT-SERIALIZABLE" >Serializable Isolation Level</A ></DT ></DL ></DD ><DT >12.3. <A HREF="explicit-locking.html" >Explicit Locking</A ></DT ><DD ><DL ><DT >12.3.1. <A HREF="explicit-locking.html#LOCKING-TABLES" >Table-Level Locks</A ></DT ><DT >12.3.2. <A HREF="explicit-locking.html#LOCKING-ROWS" >Row-Level Locks</A ></DT ><DT >12.3.3. <A HREF="explicit-locking.html#LOCKING-DEADLOCKS" >Deadlocks</A ></DT ></DL ></DD ><DT >12.4. <A HREF="applevel-consistency.html" >Data Consistency Checks at the Application Level</A ></DT ><DT >12.5. <A HREF="locking-indexes.html" >Locking and Indexes</A ></DT ></DL ></DIV ><A NAME="AEN14349" ></A ><P > This chapter describes the behavior of the <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > database system when two or more sessions try to access the same data at the same time. The goals in that situation are to allow efficient access for all sessions while maintaining strict data integrity. Every developer of database applications should be familiar with the topics covered in this chapter. </P ><DIV CLASS="SECT1" ><H1 CLASS="SECT1" ><A NAME="MVCC-INTRO" >12.1. Introduction</A ></H1 ><A NAME="AEN14355" ></A ><P > Unlike traditional database systems which use locks for concurrency control, <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > maintains data consistency by using a multiversion model (Multiversion Concurrency Control, <ACRONYM CLASS="ACRONYM" >MVCC</ACRONYM >). This means that while querying a database each transaction sees a snapshot of data (a <I CLASS="FIRSTTERM" >database version</I >) as it was some time ago, regardless of the current state of the underlying data. This protects the transaction from viewing inconsistent data that could be caused by (other) concurrent transaction updates on the same data rows, providing <I CLASS="FIRSTTERM" >transaction isolation</I > for each database session. </P ><P > The main advantage to using the <ACRONYM CLASS="ACRONYM" >MVCC</ACRONYM > model of concurrency control rather than locking is that in <ACRONYM CLASS="ACRONYM" >MVCC</ACRONYM > locks acquired for querying (reading) data do not conflict with locks acquired for writing data, and so reading never blocks writing and writing never blocks reading. </P ><P > Table- and row-level locking facilities are also available in <SPAN CLASS="PRODUCTNAME" >PostgreSQL</SPAN > for applications that cannot adapt easily to <ACRONYM CLASS="ACRONYM" >MVCC</ACRONYM > behavior. However, proper use of <ACRONYM CLASS="ACRONYM" >MVCC</ACRONYM > will generally provide better performance than locks. </P ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="indexes-examine.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Home</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="transaction-iso.html" ACCESSKEY="N" >Next</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Examining Index Usage</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="sql.html" ACCESSKEY="U" >Up</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Transaction Isolation</TD ></TR ></TABLE ></DIV ></BODY ></HTML >