【问题标题】:0 rows Deleted/Updated/Inserted require COMMIT in ORACLE?0 行删除/更新/插入需要在 ORACLE 中提交?
【发布时间】:2018-02-04 12:27:07
【问题描述】:

在 Oracle 数据库中,我只是运行了一个查询,然后我得到了

0 行已删除。

“0 行”DML 操作是否会锁定 ORACLE 中的表,如果是,我是否需要 COMMIT

【问题讨论】:

    标签: database oracle locking commit


    【解决方案1】:

    答案是肯定的,是的。 Oracle 锁定被修改的行等 - 如果没有行受到影响,则不会发生这种情况;但 Oracle 也会创建一个子独占 table 锁,而不管任何可能修改或可能不修改的行,并且它仅在 COMMITROLLBACK 或等效项上释放此类锁。 (当然,在这种情况下,您也可以ROLLBACK - 效果相同,因为没有行受到影响)。

    在以下会话中轻松演示:

    SQL> create table xx as
      2  select level lvl from dual connect by level <= 5;
    
    Table created.
    
    SQL> select * from xx;
    
           LVL
    ----------
             1
             2
             3
             4
             5
    
    SQL> select a.object_name, b.locked_mode
      2  from   user_objects a join v$locked_object b
      3  on a.object_id = b.object_id;
    
    no rows selected
    
    SQL> delete from xx where lvl = 10;
    
    0 rows deleted.
    
    SQL> select a.object_name, b.locked_mode
      2  from   user_objects a join v$locked_object b
      3  on a.object_id = b.object_id;
    
    
    OBJECT_NAME     LOCKED_MODE
    --------------- -----------
    XX                        3
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select a.object_name, b.locked_mode
      2  from   user_objects a join v$locked_object b
      3  on a.object_id = b.object_id;
    
    no rows selected
    

    【讨论】:

    • 谢谢!这确实令人惊讶,因为没有任何数据发生变化。
    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多