0 行 Deleted/Updated/Inserted 需要在 ORACLE 中提交?
0 rows Deleted/Updated/Inserted require COMMIT in ORACLE?
在 Oracle 数据库中,我只 运行 一个查询就得到
0 rows deleted.
“0 行”DML 操作是否会在 ORACLE 中锁定 table?如果是,我是否需要 COMMIT
?
答案是肯定的,是的。 Oracle 锁定被修改的行等 - 如果没有行受到影响,就不会发生这种情况;但是 Oracle 还创建了一个子独占 table 锁,不管任何行是否可以修改,它只在 COMMIT
或 [=12 上释放这样的锁=] 或等价物。 (当然,在这种情况下,您也可以 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
在 Oracle 数据库中,我只 运行 一个查询就得到
0 rows deleted.
“0 行”DML 操作是否会在 ORACLE 中锁定 table?如果是,我是否需要 COMMIT
?
答案是肯定的,是的。 Oracle 锁定被修改的行等 - 如果没有行受到影响,就不会发生这种情况;但是 Oracle 还创建了一个子独占 table 锁,不管任何行是否可以修改,它只在 COMMIT
或 [=12 上释放这样的锁=] 或等价物。 (当然,在这种情况下,您也可以 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