# 事务隔离级别及其缺陷

<table>
<thead>
<tr>
  <th align="left">事务隔离级别/缺陷</th>
  <th align="center">脏读</th>
  <th align="center">不可重复读</th>
  <th align="center">幻读</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="left">读未提交（read uncommit）</td>
  <td align="center">可能</td>
  <td align="center">可能</td>
  <td align="center">可能</td>
</tr>
<tr>
  <td align="left">读已提交（read commit）</td>
  <td align="center">不可能</td>
  <td align="center">可能</td>
  <td align="center">可能</td>
</tr>
<tr>
  <td align="left">可重复读（repeated read）</td>
  <td align="center">不可能</td>
  <td align="center">不可能</td>
  <td align="center">可能</td>
</tr>
<tr>
  <td align="left">可串行化（Serializable ）</td>
  <td align="center">不可能</td>
  <td align="center">不可能</td>
  <td align="center">不可能</td>
</tr>
</tbody>
</table>

脏读是一个事务读取到另一个事务未提交的数据。比如事务A把学员分数改为1，但是未提交，此时事务B读取到了这个分数，但是事务A把事务回滚了，此时事务B获取到了一个错误的数据

不可重复读是指在一个事务中两次读取的结果不同，比如事务A先获取到了学员分数为1，此时事务B将分数修改为2并提交，然后事务A再次读取学员分数得到2；造成在同一个事务中两次读取的结果不一致；造成不可重复读的操作是update

幻读是指事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集，然后再提交。比如数据库中存在学员tom的语文，数学成绩，事务根据学员名称去获取成绩查询出了语文，数学两科成绩。但此时事务B向数据库中插入了tom的英语成绩；此时数据造成了事务A的查询结果和实时不符，像出现“幻觉”一样。造成幻读的操作是delete或insert

<blockquote>
  创作不易，转载请注明文章来源为www.full-satcker.com
</blockquote>
