gpt4 book ai didi

java - 应该使用 Read committed 还是 Serializable 作为隔离级别的场景?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:36:02 24 4
gpt4 key购买 nike

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

声明:- 读提交隔离可以提供更多的并发性,但由于某些事务的幻像和不可重复读取而导致不一致结果的风险有所增加。

问题 1:-读取提交隔离如何提供比可序列化更多的并发性?根据我的理解,可序列化事务也不限制并发事务。

声明:-Oracle 可序列化事务中的所有查询都将数据库视为单个时间点

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

声明:-Oracle 的可序列化隔离适用于两个并发事务修改相同行的可能性相对较低且长时间运行的事务主要是只读的环境

问题:-假设两个事务 tran1 和 tran2 在时间 t1 开始。如果 tran1 在时间 t2 更新行 1,然后在时间 t3 更新 tran2 获取同一行,那么 tran2 会得到 tran1 完成的更新行吗​​? (我认为不会,因为 tran2 将获取时间 t1 时存在的数据状态。对吗?)

声明:-编码可序列化事务需要应用程序开发人员进行额外工作以检查“无法序列化访问”错误并撤消和重试事务。

问题:- 不确定开发人员何时会收到“无法序列化访问”错误。 我们会在下面的场景中得到同样的错误吗

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

最佳答案

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

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

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

关于java - 应该使用 Read committed 还是 Serializable 作为隔离级别的场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7743018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com