DB使用的隔离级别不仅影响数据库的并发性,而且影响并发应用程序的性能。通常,使用的隔离级别越严格,并发性就越小,某些应用程序的性能可能会随之越低,因为它们要等待资源上的锁被释放。
| Dirty Read 脏读 | NonRepeatable Read 不可重复读 | Phantom Read 幻读 |
Read uncommitted 未提交读 | Possible | Possible | Possible |
Read committed 提交读 | Not possible | Possible | Possible |
Repeatable read 可重复读 | Not possible | Not possible | Possible |
Serializable 序列化 | Not possible | Not possible | Not possible |
未提交读隔离级别是最不严格的隔离级别,现实中应用很少。在使用这个隔离级别时,仅当另一个事务试图删除或更改被检索的行所在的表时,才会锁定一个事务检索的行。因为在使用这种隔离级别时,行通常保持未锁定状态,所以脏读、不可重复读和幻像读都可能会发生。
提交读是Oracle默认的隔离级别,事务中的每一条语句都遵从语句级的读一致性,即一个语句所处理的数据集是在单一时间点上的数据集,这个时间点是这个语句开始的时间,一个语句看不见在它开始执行后提交的修改
可重复读是Mysql的默认隔离级别。在该隔离级别下,一个事务的影响完全与其他并发事务隔离,脏读、不可重复的读、幻像读现象都不会发生。当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行。因此,如果在同一个事务中发出同一个SELECT语句两次或更多次,那么产生的结果数据集总是相同的。因此,使用可重复读隔离级别的事务可以多次检索同一行集,并对它们执行任意操作,直到提交或回滚操作终止该事务。。
序列化读会使整个数据库的并发性能大幅下降,仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改,接近于串行操作,现实中应用很少。
脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
非重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读