2012-03-02 33 views
42

ロックを回避するために、テーブルに対するさらなるアクションの前にコミットする必要があるステートメントのリストは何ですか?私は、複数のステートメントとトランザクションの完全性に関する完全なトランザクションについては言及していません(代わりに、単一のステートメントを参照しています)。oracle - どの文をコミットする必要がありますか?

私はinsertがコミットされるべきであることを知っていますが、truncateには自動コミットがあります。コミットする必要があるステートメントの完全なリストは何ですか?

(スターターリスト)にコミットする必要があります

UPDATE 
INSERT 
DELETE 
+1

'truncate'は、データをRollback Tablespaceにコピーせずに直接削除します。 DDL文です。 – danihp

+2

DCLをコンパイルする必要がありますか?すなわち付与+取り消し – toop

+0

マージ。また、更新を選択すると、何も変更しなくてもロックがかかります。 –

答えて

40

DML(データ操作言語)コマンドneed to beコミット/ロールバックされます。 Hereは、これらのコマンドのリストです。

データ操作言語(DML)文は、スキーマ・オブジェクト内のデータ の管理に使用されます。いくつかの例:機械的な面では

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 
+2

SELECTまたはEXPLAIN PLAN後にコミットする必要がありますか? – toop

+1

@toop 'SELECT ... FOR UPDATE'の後にロックを解除する必要があります。 –

+1

更新の選択は完全にどのように見えるのですか?また、テーブルからちょうど標準の選択*についてはどうですか? – toop

4

DMLは、コミットまたはロールバックする必要があります。 DDLはできません。

http://www.orafaq.com/faq/what_are_the_difference_between_ddl_dml_and_dcl_commands

あなたは上の自動コミット切り替えることができ、それが唯一のDMLのために再びです。 DDLは決してトランザクションの一部ではないため、明示的なコミット/ロールバックのようなものはありません。

truncateはDDLであるため、暗黙的にコミットされます。


私は申し訳ありません。 @DCookieや@APCのように、DDLにはの暗黙のコミットのようなsthがあります。そのことについての質問はAsk Tomをご覧ください。 これは私が学んだこととは対照的で、私はまだ少し興味があります。

+1

SELECTまたはEXPLAIN PLANの後にコミットする必要がありますか? – toop

+0

これは技術的に間違っています:DDLは常にコミットを発行し、実際にはプロセスの開始時と終了時に2つを発行します。 DML文を発行してからDDLを発行すると、DMLがコミットされます。 – DCookie

+2

-1。もちろん、DDLはコミットされます。 DDLは本質的にデータ・ディクショナリへの変更の発行です。データ・ディクショナリは適用できるようにコミットする必要があります。違いは単純にコミットが暗黙的であり、DCookieの状態には2つあります。したがって、テーブルの更新を発行してからDDL文を実行すると、更新がロールバックできなくなります。後続のDDLが適用されていなくてもコミットされています。 – APC

8

がCOMMITは、トランザクションになります。つまり、トランザクションは2つのCOMMIT文(またはROLLBACK)の間に発生するすべてのアクティビティ(1つ以上のDML文)です。

Oracleでは、DDL文は、文が実行される前に暗黙的なCOMMITが発行されただけで、後で再度実行されるため、トランザクションそのものです。

システム設計の観点から見ると、トランザクションはビジネス単位です。これは、単一のDML文または複数のDML文で構成されます。それは問題ではありません。完全なトランザクションだけがCOMMITを必要とします。ビジネス単位全体を完了するまで、またはCOMMITを発行するまでCOMMITを発行することは、文字通り意味がありません。

これは重要な概念です。コミットはロックを解除するだけではありません。 Oracleでは、Interest Transaction Listなどのラッチをリリースします。これは、Oracleの読み取り整合性モデルのために影響します。不適切なコミットのために、ORA-01555: SNAPSHOT TOO OLDまたはORA-01002: FETCH OUT OF SEQUENCEなどの例外が発生します。したがって、取引が必要な限りロックに掛かることが重要です。

1

そして、キーポイント - TRUNCATE TABLEはWHERE句を持たないDELETEのように見えますが、TRUNCATEはDMLではなくDDLです。 DELETEにはCOMMITが必要ですが、TRUNCATEではCOMMITは必要ありません。