背景
今日、OracleでSQL文を使用してDELETEとUPDATEコマンドを実行しました。ローカルデータベースでは成功したように見えましたが、上司が確認したところ、データベースが削除または更新されていないとのことでした。これはなぜ起こるのでしょうか?
実際の原因は、コマンドを実行した後にCOMMITを行っていなかったためです。したがって、更新内容はメモリに保存されるだけであり、データベースにはコミットされず、他のセッションで見ることはできません。他のセッションでは、更新前のデータが表示されます。ユーザーがセッションを終了すると、Oracleは自動的にコミットを実行します。
SQL言語の分類
SQL言語は以下の5つの主要なカテゴリに分けられます:
-
DDL(データ定義言語)- Create、Alter、Dropなどの文は自動的にコミットされ、COMMITの必要はありません。
-
DQL(データクエリ言語)- SELECTクエリ文にはコミットの問題はありません。
-
DML(データ操作言語)- Insert、Update、Deleteなどの文はコミットが必要です。
-
DTL(トランザクション制御言語)- COMMIT、ROLLBACKなどのトランザクションのコミットやロールバックを行う文です。
-
DCL(データ制御言語)- Grant、Revokeなどの文は権限の付与や取り消しを行います。
COMMITの自動実施
-
DML文を実行した後にCOMMITせずにDDL文を実行すると、未コミットのデータも自動的にコミットされます。
-
ユーザーがセッションを終了すると、Oracleは自動的にコミットを実行します。
-
自動コミットを有効にすると、DML操作後に手動でコミットする必要はありません:SET AUTOCOMMIT ON;
コメント欄