ロックを回避するために、テーブルでさらにアクションを実行する前にコミットする必要があるステートメントのリストは何ですか?複数のステートメントとトランザクションの整合性を備えた完全なトランザクションについては説明していません。代わりに、単一のステートメントを参照しています。
挿入はコミットする必要がありますが、truncateには自動コミットがあります。コミットする必要があるステートメントの完全なリストは何ですか?
コミットする必要があります(スターターリスト):
UPDATE
INSERT
DELETE
DML(データ操作言語)コマンド 必要 コミット/ロールバック。 ここ は、これらのコマンドのリストです。
データ操作言語(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
機械的には、COMMITはトランザクションを作成します。つまり、トランザクションは、2つのCOMMITステートメント(またはROLLBACK)の間に発生するすべてのアクティビティ(1つ以上のDMLステートメント)です。
Oracleでは、DDL文はそれ自体がトランザクションです。これは、文が実行される前とその後に暗黙のCOMMITが発行されるためです。 TRUNCATEはDDLコマンドなので、呼び出すと暗黙的なコミットが実行されるため、明示的なコミットは必要ありません。
システム設計の観点から見ると、トランザクションはビジネスの作業単位です。単一のDMLステートメントまたは複数のDMLステートメントで構成される場合があります。関係ありません。完全なトランザクションのみがCOMMITを必要とします。業務単位全体が完了するまで、または完了するまで、COMMITを発行することは文字通り意味がありません。
これは重要な概念です。 COMMITはロックを解放するだけではありません。 Oracleでは、Interested Transaction Listなどのラッチもリリースします。これは、Oracleの読み取り一貫性モデルのために影響を及ぼします。不適切なコミットが原因で、ORA-01555: SNAPSHOT TOO OLD
やORA-01002: FETCH OUT OF SEQUENCE
などの例外が発生します。そのため、トランザクションがロックを必要とする限りロックを維持することが重要です。
DMLをコミットまたはロールバックする必要があります。 DDLはできません。
http://www.orafaq.com/faq/what_are_the_difference_between_ddl_dml_and_dcl_commands
自動コミットをオンに切り替えることができますが、これもDML専用です。 DDLは決してトランザクションの一部ではないため、明示的なコミット/ロールバックのようなものはありません。
truncate
はDDLであるため、暗黙的にコミットされます。
編集
ごめんなさい。コメントに記載されている@DCookieや@APCのように、DDLのimplicit commitsなどのsthが存在します。 Ask Tom に関する質問については、こちらをご覧ください。これは私が学んだこととは対照的であり、私はまだ少し興味があります。
キーポイント-TRUNCATE TABLEはWHERE句のないDELETEのように見えますが、TRUNCATEはDMLではなくDDLです。 DELETEにはCOMMITが必要ですが、TRUNCATEには必要ありません。