2011-10-12 127 views
3

我想弄清楚哪些隔离级别(在可串行化和读取提交之间)在哪些场景下更好。在链接http://download.oracle.com/docs/cd/B14117_01/server.101/b10743/consist.htm#i17894,我是通过主题选择隔离级别,我得到了一些清晰度和一些问题基于文章中的一些陈述。应该使用Read committed还是Serializable作为隔离级别的场景?

保护 - 咨询热点: - 提交读隔离可提供相当多的并发性的,由于幻影和非重复读一些交易的结果不一致的危险有所增加。

问题1: - Read提交隔离提供了比serializable更多的并发性吗?按照我理解的可序列化事务也不限制并发事务。

声明: -在Oracle串行化事务的所有查询看到数据库作为单个时间点的

问题: -我认为他们的意思在这里,当序列化交易开始说在时间t1那么所有的数据将从时间t1处的数据库状态呈现。 对不对? 不确定什么时候我们调用事务实际开始。 是当我们获得连接或第一次查询被触发时?

声明: - Oracle的串行化隔离,适用于环境中有一个相对较低的机会,两个并发事务将修改相同的行和长时间运行的事务主要是只读

问题: -说两个交易tran1和tran2在时间t1开始。如果tran1在时间t2更新row1,然后在时间t3更新tran2取回同一行,tran2将得到由tran1?完成的更新行。 (我觉得没有,因为TRAN2将获取数据的,它存在于时间t1的状态?)

声明: -编码序列化的交易,需要由应用程序开发人员额外的工作,以检查“无法序列访问“错误并撤消并重试交易。

问题: -不知道开发人员何时会得到“无法序列化访问”错误。 我们是否会在以下场景中得到相同的错误

说两个交易tran1和tran2在时间t1开始。如果tran1在时间t2更新row1,然后在时间t3更新tran2更新相同的row1。在这种情况下它会抛出“无法序列化访问”错误? 如果是,Oracle是否在可序列化事务的情况下内部维护版本,以便知道行已被用户更新?

回答

2

如果您想查看提交的数据,请选择read committed。每个查询可以看到不同的提交数据。

如果您想查看多个查询的相同结果,请选择可序列化。在您的交易结束之前,将返回相同的结果。

两者都有限制。选择所需的隔离级别。不要选择比您需要的隔离级别更高的隔离级别。

相关问题