为了避免锁定,在对表格采取进一步行动之前需要提交的语句列表是什么?我不是在讨论具有多个语句和事务完整性的完整事务;相反,我指的是单一陈述。
我知道insert应该被提交但truncate有一个自动提交。需要提交的完整语句列表是什么?
需要提交(入门名单):
UPDATE
INSERT
DELETE
答案 0 :(得分:52)
DML(数据操作语言)命令need to be已提交/回滚。 Here是这些命令的列表。
数据操作语言(DML)语句用于管理数据 在架构对象中。一些例子:
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
答案 1 :(得分:11)
在机械术语中,COMMIT进行交易。也就是说,事务是在两个COMMIT语句(或ROLLBACK)之间发生的所有活动(一个或多个DML语句)。
在Oracle中,DDL语句本身就是一个事务,因为在执行语句之前和之后再次发出了隐式COMMIT。 TRUNCATE是一个DDL命令,因此它不需要显式提交,因为调用它会执行隐式提交。
从系统设计的角度来看,交易是业务的工作单元。它可能包含单个DML语句或其中几个。没关系:只有完整的事务需要COMMIT。除非或直到我们完成了整个业务工作单元,否则发布COMMIT没有任何意义。
这是一个关键概念。 COMMIT不只是释放锁。在Oracle中,他们还发布了锁存器,例如感兴趣的事务列表。由于Oracle的读一致性模型,这会产生影响。由于提交不当,会出现ORA-01555: SNAPSHOT TOO OLD
或ORA-01002: FETCH OUT OF SEQUENCE
等异常。因此,对于我们的事务来说,只要需要它们就挂起锁是至关重要的。
答案 2 :(得分:6)
必须提交或回滚DML。 DDL不能。
http://www.orafaq.com/faq/what_are_the_difference_between_ddl_dml_and_dcl_commands
您可以启用自动提交,仅针对DML进行切换。 DDL永远不是事务的一部分,因此没有像显式提交/回滚那样的东西。
truncate
是DDL,因此隐式提交。
修改强>
我要说对不起就像评论中提到的@DCookie和@APC一样,存在类似于DDL的隐式提交。请参阅此处,了解Ask Tom上有关该问题的问题。
这与我所学到的相反,我仍然有点好奇。
答案 3 :(得分:3)
关键点 - 尽管TRUNCATE TABLE看起来像没有WHERE子句的DELETE,但TRUNCATE不是DML,而是DDL。 DELETE需要COMMIT,但TRUNCATE不需要。