0 行删除/更新/插入需要在 ORACLE 中提交?

Posted

技术标签:

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

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

0 行已删除。

“0 行”DML 操作是否会锁定 ORACLE 中的表,如果是,我是否需要 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

【讨论】:

谢谢!这确实令人惊讶,因为没有任何数据发生变化。

以上是关于0 行删除/更新/插入需要在 ORACLE 中提交?的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate Oracle - 事务提交问题

oracle 插入100万条数据,更新100万条数据

自治事务在 Oracle 中有自己的会话吗?

oracle,FORM,删除数据时,只能按插入的顺序删除,才不会报错。(FRM 40654 记录已被其他使用者更新 )

Oracle SQL CURSOR 更新与加入和提交

oracle中DDL DML指啥?