应该使用Read committed或Serializable作为隔离级别的场景?

时间:2011-10-12 16:01:57

标签: java oracle isolation-level

我试图找出哪些隔离级别(可序列化和读取已提交)在哪些情况下更好。在链接http://download.oracle.com/docs/cd/B14117_01/server.101/b10743/consist.htm#i17894中,我通过主题选择隔离级别 ,我根据文章中的一些陈述得到了一些清晰度和一些问题。

Satement : - 读取已提交的隔离可以提供更多的并发性,并且由于某些事务的幻像和不可重复读取而导致结果不一致的风险稍大。

问题1: - Read committed isolation如何提供比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是否在内部维护版本以防止可序列化的事务,以便知道用户已更新行?

1 个答案:

答案 0 :(得分:2)

如果要查看已提交的数据,请选择“已提交读取”。每个查询都可以看到不同的提交数据

如果要查看多个查询的相同结果,请选择serializable。在您的交易结束之前,将返回相同的结果。

两者都有限制。选择所需的隔离级别。不要选择超出您需要的隔离级别。