关于可序列化交易的一些疑问?

Posted

技术标签:

【中文标题】关于可序列化交易的一些疑问?【英文标题】:Some queries regarding serializable transactions? 【发布时间】:2011-10-14 17:59:09 【问题描述】:

我已经读过,提交的隔离可以提供比可序列化隔离级别更多的并发性。

我的问题是已提交的读隔离如何提供比可序列化更多的并发性?。一个简短的场景会很有帮助

问题:- 说两个事务 tran1 和 tran2 在时间 t1 开始(当我说事务开始时,这里的意思是事务在它们触发某些查询时开始对吗?)。如果 tran1 在时间 t2 更新 row1 并且稍后在时间 t3 tran2 获取同一行,它将不会由 tran1 完成更新的行。对吗?我这么说是因为 tran1 和 tran2 将呈现来自的结果在时间 t1 存在的数据状态。正确吗?事务开始时是否会拍摄完整数据库的快照?

我已阅读到,对可序列化事务进行编码需要应用程序开发人员进行额外的工作,以检查“无法序列化访问”错误并撤消并重试事务。 不确定开发人员何时会收到“无法序列化访问”错误?在下面的场景中我们会得到同样的错误吗

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

【问题讨论】:

Oracle 并没有真正的可序列化事务。 Oracle 使用多版本并发控制,这意味着您可以在传统的面向锁的数据库中以一小部分成本获得可序列化事务的大部分好处。不过,我对此了解的不够多,无法写出真正的答案,抱歉。 Does transaction take the snapshot of complete database when it begins? 想想一个(相当中等大小的)1GB 数据库,每分钟只有(少数)1000 个事务。您知道可以拍摄每分钟 1TB 快照的盒子吗? @ypercube。同意它不会完全拍摄快照。但这将是类似的东西。那是我要找的吗? 是的,你需要自己管理版本,我想你说的是如何处理并发,见:***.com/questions/7455726/… 【参考方案1】:

请参阅Oracle 文档,了解隔离级别和数据并发性。

【讨论】:

嗨 tbone,在通过这个和其他各种文章之后,我想出了这些疑问。如果你能在上面阐明一下,那将是非常有帮助的。

以上是关于关于可序列化交易的一些疑问?的主要内容,如果未能解决你的问题,请参考以下文章

为啥两个具有隔离可序列化的事务在写入不同的行时被阻塞

这个的可序列化图是啥?

TypeError: datetime.datetime() 不是 JSON 可序列化的

Postgresql 可序列化事务未按预期工作

关于关于序列自增实际应用

关于random_shuffle的一个疑问