MySQL事务的隔离级别

来源:互联网 发布:如何开农村淘宝店 编辑:程序博客网 时间:2024/05/16 08:40

设置的目的

在数据库操作中,为了有效保证并发读取数据的正确性,提出事务的隔离级别。

数据库事务并发带来的问题

  • 更新丢失:两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任锁操作,因此并发事务没有被隔离出来。
  • 脏读:一个事物开始读取某行数据,但是另外一个事务已经更新了此数据但没有及时提交。
  • 不可重复读:一个事物两次读取数据,两次读取的数据不一样。
  • 幻读:一个事物在读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行(受插入和删除的影响)。
为了避免上面出现的几种情况,在标准的SQL规范中,定义了四个事务隔离级别,不同的隔离级别对事务的处理不同。

Read Uncommitted(读取未提交内容)
在该隔离级别,所有的事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不必其他级别好多少。

Read Committed(读取提交内容)
这是大多数数据库默认的隔离级别(但MySQL默认的是Repeatable Read)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种事务隔离级别也支持不可重复读,因为同一事务的其他实例在该实例处理期间可能会有新的commit,所以同一select可能返回不同的结果。

Repeatable Read(可重读)
这是MySQL默认的事务隔离级别,它确保同一事物的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致一个棘手的问题:幻读。InnoDB和Falcon存储引擎通过多版本并发控制机制解决了该问题。

Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量超时现象和锁竞争。

在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下:


 

0 0