Concurrency management

Data consistency and concurrency concepts

  • Data Consistency applies to situations when readers want to access data currently being modified by writers.
  • Concurrent Data Access applies to situations when several writers are accessing the same data for modification.
  • Locking Granularity defines the amount of data concerned when a lock is set (for example, row, page, table).

Informix®

Informix uses a locking mechanism to handle data consistency and concurrency. When a process changes database information with UPDATE, INSERT or DELETE, an exclusive lock is set on the touched rows. The lock remains active until the end of the transaction. Statements performed outside a transaction are treated as a transaction containing a single operation and therefore release the locks immediately after execution. SELECT statements can set shared locks, depending on isolation level. In case of locking conflicts (for example, when two processes want to acquire an exclusive lock on the same row for modification, or when a writer is trying to modify data protected by a shared lock), the behavior of a process can be changed by setting the lock wait mode.

Control:

  • Lock wait mode: SET LOCK MODE TO ...
  • Isolation level: SET ISOLATION TO ...
  • Locking granularity: CREATE TABLE ... LOCK MODE {PAGE|ROW}
  • Explicit exclusive lock: SELECT ... FOR UPDATE

Defaults:

  • The default isolation level is READ COMMITTED.
  • The default lock wait mode is NOT WAIT.
  • The default locking granularity is PAGE.

IBM® DB2®

As in Informix, IBM DB2 uses locks to manage data consistency and concurrency. The database manager sets exclusive locks on the modified rows and shared locks when data is read, based on the isolation level. The locks are held until the end of the transaction. When several processes want to modify the same data, the latest processes must wait until the first finishes its transaction. Readers do not have to wait for writers: Row versioning is supported, to allow data to be commited before the modification in progress. The lock granularity is at the row or table level. For more details, see DB2's Administration Guide, "Application Consideration".

Control:

  • Lock wait mode: Always WAIT. Only the Lock Timeout can be changed, but this is a global database parameter.
  • Isolation level: Can be set through an API function call or with a database client configuration parameter.
  • Locking granularity: Row level or Table level.
  • Explicit locking: SELECT ... FOR UPDATE

Defaults:

  • The default isolation level is Cursor Stability (readers cannot see uncommitted data, no shared lock is set when reading data).

Solution

The SET ISOLATION TO ... Informix syntax is replaced by an ODBC API call setting the SQL_ATTR_TXN_ISOLATION connection attribute. The next table shows the isolation level mappings applied by the database driver:

Table 1. Isolation level mappings done by the IBM DB2 LUW database driver
SET ISOLATION instruction in program ODBC SQL_ATTR_TXN_ISOLATION connection attribute
SET ISOLATION TO DIRTY READ SQL_TXN_READ_UNCOMMITTED
SET ISOLATION TO COMMITTED READ [READ COMMITTED] [RETAIN UPDATE LOCKS] SQL_TXN_READ_COMMITTED
SET ISOLATION TO CURSOR STABILITY SQL_TXN_REPEATABLE_READ
SET ISOLATION TO REPEATABLE READ SQL_TXN_SERIALIZABLE

For portability, it is recommended that you work with Informix in the read committed isolation level, to make processes wait for each other (lock mode wait) and to create tables with the "lock mode row" option.

See Informix and IBM DB2 documentation for more details about data consistency, concurrency and locking mechanisms.