# 数据库并发问题

## 多事务运行时的并发问题

### 第一类丢失跟新
撤销一个事务时，把其他事务已提交的跟新数据覆盖

### 脏读
一个事务读到另一个事务未提交的跟新数据

### 虚读
一个事务读到另一个事务已提交的新插入的数据；

### 不可重新读
一个事务读到另一个事务已提交的跟新数据；

### 第二类丢失跟新
这是不可重复读中的特例，一个事务覆盖另一个事务已提交的跟新数据。

## 数据库锁
<table>
<tr>
<th>资源上已放置的锁</th>
<th>第二个事务读操作</th>
<th>第二个食物跟新操作</th>
</tr>

<tr>
<td>无</td>
<td>立即获取锁</td>
<td>立即获取锁</td>
</tr>

<tr>
<td>共享锁</td>
<td>立即获取共享锁</td>
<td>等待第一个事务解除共享锁</td>
</tr>

<tr>
<td>独占锁</td>
<td>等待第一个事务解除独占锁</td>
<td>等待第一个事务解除独占锁</td>
</tr>
</table>

## 共享锁
用于读数据操作，他是非独占的，允许其他事务同时读取其锁定的资源，但不允许其他事务更新他。
1. 加锁条件：当一个事务执行select语句时。
2. 解锁条件：默认情况下，数据读取后，数据库系统立即释放共享锁。
3. 兼容性：放置共享锁后还可放置共享锁和更新锁。
4. 并发性：具有良好的并发性能。当多个事务读取相同的数据时，每个事务都会获得一把共享锁，因此可以同时读锁定的数据。

## 独占锁
也叫排他锁，使用与修改数据的场合。他锁定的资源，其他事务不能进行读写。
1. 加锁条件：当一个事务执行insert,update,delete时，数据库系统会自动对被操作的数据使用独占锁。如果该数据已有其他锁存在，则不能放置独占锁。
2. 解锁条件：事务结束。
3. 兼容性：不和其他锁兼容。
4. 并发性：并发性差，只允许有一个事务访问锁定数据。其他事务需等待，直到当前事务结束。

## 跟新锁
更新操作的初始阶段用来锁定可以能要被修改资源的锁。更新锁可避免使用共享锁造成的死锁现象。
1. 加锁条件：当执行update时，数据库系统会先为事务分配一个更新锁。
2. 解锁条件：当读取数据完毕，执行更新操作时，更新锁升级为独占锁。
3. 兼容性：与共享锁兼容。一个资源可同时放置更新锁和共享锁，但只能放置一把更新锁。
4. 并发性：允许多个事务同时读锁定的资源，但不允许其他事务修改。

## 其他锁
1. [悲观锁和乐观锁 ](http://www.hollischuang.com/archives/934)<br>
2. [共享锁和排他锁](http://www.hollischuang.com/archives/923) <br>
3. 意向锁<br>
	1. 意向排他锁
	2. 意向共享锁

## 推荐文章
1. [MySQL锁(InnoDB存储引擎)](http://www.jianshu.com/p/6809adb3e9e7) <br>
