Concurrency Control

A database typically serves multiple users at the same time

  • the goal in this case is to make an impression that everything works in isolation
  • Concurrency Control deals with that: it ensures that transactions have the same effect as if they were run in isolation


Conflicts

Write-Read Conflict

Problem:

  • one transaction $T_1$ is reading a DB item that was written by another transaction $T_2$
  • without $T_2$ having completed
  • this results in Write-Read Conflict


Illustrative Example

  • suppose there are two transactions $T_1$ and $T_2$
  • $T_1$ transfers 100 USD from one account to another
  • $T_2$ gives 6% interest rate to all accounts
$T_1$ $T_2$
Read($A, s$) read from $A$ to main-memory variable $s$
$s \leftarrow s - 100$ withdraw 100 USD from $A$
Write($A, s$) persist the result to disk
Read($A, t$)
$t \leftarrow t \times 1.06$ give 6% interest rate to $A$
Write($A, t$) note that at this moment the money hasn't appeared at $B$ yet
Read($B, t$)
$t \leftarrow t \times 1.06$ give 6% interest rate to $B$
Write($B, t$)
Read($B, s$)
$s \leftarrow s + 100$ put 100 USD to $B$
Write($B, s$) persist the result to disk

Assume both $A$ and $B$ have 100 USD

  • $A$ won't get any interest (no money at the moment of interest calculation)
  • $B$ will get interest only on 100 USD instead of 200 USD

Reason:

  • two transactions interleaved,
  • it should be either
    • first all actions of $T_1$ and then all actions of $T_2$ or
    • first all actions of $T_2$ and then all actions of $T_1$

Write-Write Conflict

Problem:

  • both transactions are just writing new values without reading the old ones

Example

  • $T_1$ puts 100 USD to both $A$ and $B$
  • $T_2$ puts 200 USD to both $A$ and $B$
$T_1$ $T_2$
$s \leftarrow 100$
Write($A, s$)
$t \leftarrow 200$
Write($A, t$)
$t \leftarrow 200$
Write($B, t$)
$s \leftarrow 100$
Write($B, s$)

We want the transactions to run in some sequence

  • as if they were not allowed to interleave

Not consistent state:

  • $B$ has 100 USD, $A$ has 200

Consistent state:

  • both have 200 USD (first $T_1$ then $T_2$)
  • both have 100 USD (first $T_2$ then $T_1$)


Scheduling

  • The Scheduler is responsible for creating an impressions that all transactions are run in isolation


Approaches


Distributed Concurrency

  • Multi-Master
  • Master/Slave
  • Partitioning
  • Sharding
  • Write thought Caches


Sources