oracle 并发与事务

锁是保护多用户并发访问共享资源时,出现的包括不可重复读,幻读,脏读等问题而设计的安全机制。然而并发是数据库重要性能之一,如果一个数据库不能支持多用户并发访问,那么肯定会失去价值。

但是Oracle 对并发的支持不只是高效的锁定。它还实现了一种多版本(multi-versioning)体系结构,这种体系结构提供了一种受控但高度并发的数据访问。多版本是指,Oracle 能同时物化多个版本的数据,这也是Oracle 提供数据读一致视图的机制(读一致视图即read-consistent view,是指相对于某个时间点有一致的结果)。多版本有一个很好的副作用,即数据的读取器(reader)绝对不会被数据的写入器(writer)所阻塞。换句话说,写不会阻塞读。这是Oracle 与其他数据库之间的一个根本区别。在Oracle 中,如果一个查询只是读取信息,那么永远也不会被阻塞。它不会与其他会话发生死锁,而且不可能得到数据库中根本不存在的答案。

事务隔离级别:

READ UNCOMMITED :允许脏读。意思是允许查询人员查询别的用户尚未提交的数据和信息。其他数据库提供这种级别主要原因就在于读不阻塞写操作。然而oracle为了提供一个一致(正确)的答案,Oracle 在这个时刻会创建该块的一个副本,其中包含查询开始时行的“本来面目”。这样一来,Oracle 就有效地绕过了已修改的数据,它没有读修改后的值,而是从undo 段(也称为回滚(rollback)段)重新建立原数据。因此可以返回一致而且正确的答案,而无需等待事务提交。ORACLE不支持脏读,它认为脏读是一个缺点,不是一个特性。

READ COMMITTED:事务只能读取数据库中已经提交的数据。这里没有脏读,不过可能有不可重复读(也就是说,在同一个事务中重复读取同一行可能返回不同的答案)和幻像读(与事务早期相比,查询不光能看到已经提交的行,还可以看到新插入的行)。在数据库应用中,READ COMMITTED 可能是最常用的隔离级别了,这也是Oracle 数据库的默认模式,很少看到使用其他的隔离级别。

REPEATABLE READ:查询得到的结果相对于某个时间点来说应该是一致。大多数其他数据库是通过共享读锁来实现的。然而共享读锁会阻止其他会话修改数据,影响并发性,出现阻塞等问题。在ORACLE中,采用了更具并发性的多版本模型来提供读一致的答案。ORACLE从不采用共享读锁机制。

SEAIALIZABLE:序列化事务。是最高级别的事务。SERIALIZABLE 事务在一个环

境中操作时,就好像没有别的用户在修改数据库中的数据一样。我们读取的所有行在重新读取时都肯定完全一样,所执行的查询在整个事务期间也总能返回相同的结果。如果你的事务想要更新的数据已经被其他事务更新,就会得到一个ORA-01877错误,原因可能是:包含这一行的块上有其他行正在被修改。

     ORACLE 还提供READ ONLY级别的事务,这种事务拥有序列化事务所有的特点,惟一的区别是READ ONLY 事务不允许修改。因此你不会得到ORA-01877错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值