study/mysql/数据库并发问题.md

77 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据库并发问题
## 多事务运行时的并发问题
### 第一类丢失跟新
撤销一个事务时,把其他事务已提交的跟新数据覆盖
### 脏读
一个事务读到另一个事务未提交的跟新数据
### 虚读
一个事务读到另一个事务已提交的新插入的数据;
### 不可重新读
一个事务读到另一个事务已提交的跟新数据;
### 第二类丢失跟新
这是不可重复读中的特例,一个事务覆盖另一个事务已提交的跟新数据。
## 数据库锁
<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>