原文:数据库隔离的四个级别分别是什么
数据库隔离的四个级别分别是: 1、读取未提交内容; 2、读取提交内容; 3、可重复读; 4、可串行化。 隔离级别采取不同的锁类型来实现, 若读取的是同一个数据可能发生脏读、幻读等问题。
事务的四个性质: 1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。 2、一致性(Consistency):几个并行执行的事务,其执行结果必须与 按某一顺序串行执行的 结果相一致。 3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。 4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。
数据库隔离的四个级别分别为:
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。
本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。
读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。
它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),
因为同一事务的其他实例在该实例处理其间可能会有新的commit,
所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,
它确保同一事务的多个实例在并发读取数据时,
会看到同样的数据行。
不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。
简单的说,幻读指当用户读取某一范围的数据行时,
另一个事务又在该范围内插入了新行,
当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,
使之不可能相互冲突,从而解决幻读问题。
简言之,它是在每个读的数据行上加上共享锁。
在这个级别,可能导致大量的超时现象和锁竞争。
隔离级别设置错误会产生的问题
这四种隔离级别采取不同的锁类型来实现,
若设置错误的话,在读取同一个数据时,就容易发生问题。例如:
脏读(Drity Read):
事务1在更新一份数据,事务2在此时读取了这份数据,
由于某些原因,前事务1回滚了操作,则事务2所读取的数据就是错的。
不可重复读(Non-repeatable read):
在一个事务的两次查询之中数据不一致,违背一致性原则。
这可能是两次查询过程中间插入了一个事务提交,更新了原有的数据,
而且由此两次查询中间可能产生误判,误操作。
幻读(Phantom Read):
在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,
而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | √ | √ | √ |
读已提交 | X | √ | √ |
可重复读 | X | X | √ |
可串行化 | X | X | X |