没有进行commit操作的数据是否能被查询到,关于oracle的脏读和隔离级别

以前在辽宁电信做数据转换的时候曾经问过别人一个问题,“修改的数据没有进行commit操作时,能否被其他用户查询到”,当时就被同事鄙视了,在大家眼里这个问题的结果是弱智和显而易见的,但是其实这是一个可以深入研究的问题。

关于脏读

“修改的数据没有进行commit,可以被其它用户查到”,这种场景即为“脏读(dirty read)”。

脏读存在的意义是为了实现非阻塞读(高并发无等待),但是Oracle可以完全得到脏读的所有好处(即无阻塞),而不会带来任何不正确的结果,所以oracle不支持脏读,但是sqlserver等一些数据库是支持脏读的。

oracle是怎么实现这种机制的?当一条数据被修改而未进行commit时,当有其它用户查询这条数据时,oracle会绕过已修改的原数据,而是从undo段获得数据。因此可以返回一致而且正确的答案,而无需等待事务提交。

关于隔离级别

标准sql的隔离级别如下

级别

oracle提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only。由于oracle不支持read uncommited,所以oracle不支持脏读。oracle默认的的事务隔离级别为read commited。

read uncommited的隔离级别最低, serializable的隔离级别最高。

较低的隔离级别可以增强许多用户同时访问数据的能力,但也增加了用户可能遇到的并发副作用(例如脏读或丢失更新)的数量。相反,较高的隔离级别减少了用户可能遇到的并发副作用的类型,但需要更多的系统资源,并增加了一个事务阻塞其他事务的可能性。

文章目录
  1. 关于脏读
  2. 关于隔离级别