在Oracle中读取COMMITTED数据库隔离级别

Ben*_*Ben 5 sql oracle transactions isolation-level read-committed

我正在开发一个连接到oracle的网络应用程序.我们在oracle中有一个表"激活"列.任何时候只有一行可以将此列设置为1.为了强制执行此操作,我们一直在Java中使用SERIALIZED隔离级别,但是我们遇到了"无法序列化事务"错误,并且无法解决原因.

我们想知道READ COMMITTED的隔离级别是否可以完成这项工作.所以我的问题是:

如果我们有一个涉及以下SQL的事务:

SELECT *
FROM MODEL;

UPDATE MODEL
SET ACTIVATED = 0;

UPDATE MODEL
SET ACTIVATED = 1
WHERE RISK_MODEL_ID = ?;

COMMIT;
Run Code Online (Sandbox Code Playgroud)

假设这些事务中有多个事务可能同时执行,那么多个MODEL行是否可以将激活标志设置为1?

任何帮助,将不胜感激.

Vin*_*rat 3

您的解决方案应该有效:您的第一次更新将锁定整个表。如果另一笔交易未完成,则更新将等待。您的第二次更新将保证只有一行的值为 1,因为您正在锁定表(但是它不会阻止 INSERT 语句)。

您还应该确保带有 的行RISK_MODEL_ID存在(否则在事务结束时您将有零行,其值为“1”)。

为了防止并发 INSERT 语句,您可以锁定表(在独占模式下)。