代码之家  ›  专栏  ›  技术社区  ›  ImaginaryHuman072889

Oracle—如何防止多个进程更新同一行?

  •  0
  • ImaginaryHuman072889  · 技术社区  · 8 年前

    在Oracle中,有没有一种方法可以在另一个进程从数据库行中读取数据时将其“锁定”?我遇到的一个问题是,有时如果两个进程尝试访问同一数据库行并同时更新它,则其中一个更新可能会丢失。

    这是一个基本的时间图表发生了什么。

    Process #1              Process #2
    ------------------      ------------------
    Read from Database
    Some processing...      Read from database
    Some processing...      Some processing...
    Update database         Some processing...
                            Update database
    

    在上面的示例中,进程1的更新丢失,因为进程2在进程2完成更新之前从数据库中读取。

    我可以修改代码,让Process#2告诉Process#1用什么更新数据库,让Process#1处理与数据库的所有交互,但不幸的是,在我的情况下,有几十个进程和数据库表我正在处理,所以我不确定这样的更改是否可行。

    数据库中有什么可以防止这个问题发生的方法吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   eifla001    8 年前

    您可以在查询中使用FOR UPDATE子句。

    有关此子句的详细信息,请参阅以下链接: https://www.techonthenet.com/oracle/cursors/for_update.php

    请检查下面的问题,以获取一些用于更新的示例代码。

    链接: How to use Oracle DB sequences without losing the next sequence number in case of roll-back

        2
  •  1
  •   Bobby Durrett    8 年前

    您可以使用设置事务隔离级别可序列化;

    窗口1:

    SQL> SET TRANSACTION ISOLATION
      2  LEVEL SERIALIZABLE;
    
    Transaction set.
    

    窗口2:

    二级可串行化;
    
    事务集。
    

    SQL> select * from test;
    
    no rows selected
    
    SQL> insert into test values (1);
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.
    

    窗口2:

    SQL> select * from test;
    
    no rows selected
    

    推荐文章