ORACLE:模拟未提交的读取行为

Posted

技术标签:

【中文标题】ORACLE:模拟未提交的读取行为【英文标题】:ORACLE: Simulate READ UNCOMMITTED Behavior 【发布时间】:2020-04-17 11:50:51 【问题描述】:

使用 Oracle,我需要允许另一个事务查看未提交的数据或在更改它的事务未成功完成时将回滚的数据。

我们来看例子:

安排

CREATE TABLE Car
(
   Name VARCHAR(20) NOT NULL,
   Building NUMBER(1) NOT NULL
);

INSERT INTO Car (Name, Building) VALUES ('Car 1', 0);

行动

连接 1

UPDATE Car SET Building = 1 WHERE Name = 'Car 1';

连接 2

SELECT * FROM Car;

结果:

Name       Building
===================
'Car 1'  |  1
         |

--Should be able to view the new Building value (1/true) from CONNECTION1 before 
--the CONNECTION1 transaction be commited.

连接 1

--Do a lot of work to build the car (20seconds), then sets the Building flag to 0 and commits the transaction.

在 SQL Server 的 CONNECTION2 上使用 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED 可以达到,但在 Oracle 中不行,它没有这个选项。

我需要提供最终用户查看汽车是否已制造,并且我需要确保在汽车制造过程中发生某些故障(如能源故障),建筑标志返回 0/false。

【问题讨论】:

这是一个非常奇怪的要求。你真正想做什么?为什么不立即提交update 【参考方案1】:

我需要提供最终用户查看汽车是否已制造,并且我需要确保在汽车制造过程中发生某些故障(如能源故障),建筑标志返回 0/false。

为什么不管理可能的状态列表,而不是(或除此之外)使用布尔标志,例如:

0 - 新 1 - 正在构建中 2 - 构建失败 3 - 构建成功

这样,您可以让处理构建的连接在流程开始和结束时更新状态(并始终立即提交)。在另一个连接上,您可以跟踪项目的生命周期。

【讨论】:

用户提交汽车进行构建。我将构建状态设置为“构建中”并提交。其他用户可以查看新状态,ok。由于电源故障,构建过程崩溃。我此时需要设置Build Failed的状态,我不能离开为“build in progress”,那我该如何实现呢?我的应用程序此时已关闭。 @ViniciusGonçalves:好的,我明白你的意思了:如果您的应用程序崩溃,那么一种解决方案是在每次应用程序重新启动后将所有正在进行的构建更改为失败,如下所示:@ 987654325@. 在像使用容器这样的多实例应用程序中,有很多实例处理一些“进行中”状态:/ 所以我不能这样做。

以上是关于ORACLE:模拟未提交的读取行为的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer之创建事务未提交读

MySQL事务隔离级别

PostgreSQL中事务的隔离级别

事物的隔离级别

事务的隔离级别和传播行为

Oracle 学习总结 - 隔离级别以及问题诊断