【问题标题】:Allow multiple update on different transaction Oracle允许对不同事务 Oracle 进行多次更新
【发布时间】:2018-08-16 21:04:05
【问题描述】:

是否可以在 Oracle 11g 上允许在 2 个不同事务的同一行上进行多个 UPDATE ?

例如在第一笔交易中

UPDATE MYTABLE SET COLUMN1 = 'value1'

并且在第二个事务中,更新被第一个事务锁定。

UPDATE MYTABLE SET COLUMN1 = 'value2'

我需要允许这两个更新在他们自己的事务中可见。
在我的上下文中,两个事务都将在最后回滚。
这就像与每个事务关联的 1 级缓存,所有修改都将被应用和读取,直到提交。

【问题讨论】:

  • 我认为这是不可能的。您想通过更新此表来达到什么目的?
  • 我有数百个使用 jdbc 的 Java 集成测试。每个测试都封装在一个预言机事务中。在测试开始时,我根据特定的测试条件更新数据库。我运行测试,然后回滚事务以将数据库保留为初始状态。这种方法的局限性在于我只能按顺序运行测试,不能并行运行。我正在寻找一种方法来隔离事务的修改,而不会像一级缓存那样阻塞其他事务。
  • 您将无法在两个不同的事务中更新同一行。当然,您可以更新测试中的不同行,这样您就可以并行运行它们。

标签: oracle transactions isolation


【解决方案1】:

你可以这样做,但你会观察到预期的行为 - 你可以UPDATE 那些的记录,即来自其他会话的操作事务的主题,但你必须等到第一个事务被提交(或回滚)。

所以你的场景会被序列化:

UPDATE  from session 1

UPDATE from session 2  is waiting

ROLLBACK from session 1

UPDATE from session 2 is completed

您可以使用此设置对其进行测试:

会话 1

create table MYTABLE(column1 varchar2(10));

insert into MYTABLE(column1) values(null);
commit;

UPDATE MYTABLE SET COLUMN1 = 'value1';
select * from MYTABLE;
COLUMN1  
----------
value1 

第 2 节

UPDATE MYTABLE SET COLUMN1 = 'value2';

正在等待会话 1 提交或回滚。

【讨论】:

  • 确实这是我观察到的行为。我想知道是否可以通过使用 Oracle 隔离级别来避免这种等待。
  • @loonis 没有隔离级别;您是否正在寻找 global temporary table,它可以由任何会话独立更新(和插入)...
  • 我有一个现有的数据库,其中包含在每次测试开始时更新的数千个表。在我的情况下,我看不到使用全局临时表的方法。
【解决方案2】:

您可以更新单个 sql 中的多个列。参考我的 sql。

更新 MYTABLE SET COLUMN1 = 'value1',COLUMN1 = 'value2'

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多