oracle事务隔离级别:SERIALIZABLE

SERIALIZABLE

一般认为这是最受限的隔离级别,但是它也提供了最高程度的隔离性。SERIALIZABLE事务在一个环境中操作时,就好像没有别的用户在修改数据库中的数据一样。我们读取的所有行在重新读取时都肯定完全一样,所执行的查询在整个事务期间也总能返回相同的结果。SERIALIZABLE这个隔离级别可以确保这两个查询总会返回相同的结果。其他事务的副作用对查询是不可见的,而不论这个查询运行了多长时间。

Oracle中是这样实现SERIALIZABLE事务的:原本通常在语句级得到的读一致性现在可以扩展到事务。结果并非相对于语句开始的那个时间点一致,而是在事务开始的那一刻就固定了。换句话说,Oracle使用undo段按事务开始时数据的原样来重建数据,而不是按语句开始时的样子重建。

Oracle采用了一种乐观的方法来实现串行化,它认为你的事务想要更新的数据不会被其他事务所更新,而且把宝押在这上面。一般确实是这样的,所以说通常这个宝是押对了,特别是在事务执行得很快的OLTP型系统中。尽管在其他系统中这个隔离级别通常会降低并发性,但是在Oracle中,倘若你的事务在执行期间没有别人更新你的数据,则能提供同等程度的并发性,就好像没有SERIALIZABLE事务一样。另一方面,这也是有缺点的,如果宝押错了,你就会得到ORA-08177错误。不过,可以再想想看,冒这个险还是值得的。如果你在使用一个SERIALIZABLE事务,就不要指望它与其他事务一同更新同样的信息。所以,如果使用SERIALIZABLE隔离级别,只要保证以下几点就能很在成效。

.一般没有其他人修改相同的数据

.需要事务级读一致性

.事务都很短

在许多其他的实现中,这种隔离性都是利用共享读锁达到的,相应地会带来死锁和阻塞。而在Oracle中 ,没有任何阻塞,但是如果其他会话修改了我们也想修改的数据,则会得到ORA-08177错误。

如果安全级别设置为SERIALIZABLE,事务开始之后,不会看到数据库中作出任何修改,直到提交事务为止。

SERIALIZABLE并不意味着用户执行的所有事务都表现得好像是以一种串行方式一个接一个地执行。SERIALIZABLE不代表事务有某种串行顺序并且总能得到相同的结果。

本文来源 我爱IT技术网 http://www.52ij.com/jishu/5221.html 转载请保留链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值