oracle – 需要提交哪些语句?
为了避免locking,在进一步处理表格之前需要执行哪些语句列表? 我不是在谈论具有多个语句和事务完整性的完整事务(而是指的是单个语句)。
我知道插入应该承诺,但截断有一个自动提交。 什么是需要承诺的完整的陈述清单?
需要承诺(首发名单):
UPDATE INSERT DELETE
DML(数据操作语言)命令需要被提交 /回滚。 这是这些命令的列表。
数据操作语言(DML)语句用于pipe理模式对象中的数据。 一些例子:
SELECT - retrieve data from the a database INSERT - insert data into a table UPDATE - updates existing data within a table DELETE - deletes all records from a table, the space for the records remain MERGE - UPSERT operation (insert or update) CALL - call a PL/SQL or Java subprogram EXPLAIN PLAN - explain access path to data LOCK TABLE - control concurrency
在机械方面,COMMIT进行交易。 也就是说,事务是在两个COMMIT语句(或ROLLBACK)之间发生的所有活动(一个或多个DML语句)。
在Oracle中,DDL语句本身就是一个事务,因为隐式的COMMIT是在语句执行之前发出的,之后再发生。
从系统devise的angular度来看,交易是一个业务单位。 它可能由单个DML语句或其中几个组成。 没关系:只有完整的事务需要COMMIT。 除非或者直到我们完成了整个业务单元,否则发出COMMIT是毫无意义的。
这是一个关键的概念。 COMMIT不只是释放锁。 在Oracle中,他们还释放锁存器,如“感兴趣的事务列表”。 由于Oracle的读取一致性模型,这会产生影响。 ORA-01555: SNAPSHOT TOO OLD
或ORA-01002: FETCH OUT OF SEQUENCE
exception是由于不适当的提交而发生的。 因此,我们的交易至关重要的是只要他们需要locking。
DML必须被提交或回滚。 DDL不能。
http://www.orafaq.com/faq/what_are_the_difference_between_ddl_dml_and_dcl_commands
您可以开启自动提交function,而且仅限于DML。 DDL从来不是事务的一部分,因此没有什么像显式的提交/回滚。
truncate
是DDL,因此隐含地提交。
编辑
我必须说对不起 就像@DCookie和@APC在注释中所说的那样,存在着像隐式提交 DDL一样的东西。 有关Ask Tom的问题,请看这里。 这与我所学到的相反,我仍然有点好奇。
还有一个关键点 – 虽然TRUNCATE TABLE看起来像一个没有WHERE子句的DELETE,但是TRUNCATE不是DML,而是DDL。 DELETE需要一个COMMIT,但是TRUNCATE不需要。