トランザクションは、次の 4つの特性を満たさなければなりません。これら 4つの特性は、それぞれの名前の頭文字をとって ACID 特性といいます。
原子性 (ATOMICITY)
トランザクションは、それ以上分割することのできない最小の作業単位であるということです。このため、トランザクションを構成する処理の結果がすべて有効になるか、またはすべて無効になるかのいずれかであるということです。
例えば、あるトランザクションに処理 A と処理 B があるとします。処理 A と処理 B が正しく実行されたときは両方の処理結果が有効になります。しかし、処理 A だけ、または処理 B だけが正しく実行された場合は、両方の処理結果が無効になります。一貫性 (CONSISTENCY)
トランザクションで処理されるデータは、実行前と後でデータの整合性を持ち、一貫したデータを確保しなければなりません。隔離性 (ISOLATION)
処理対象が同じデータである複数のトランザクションを一度に実行する場合は、それぞれのトランザクションは隔離された (独立された) 状態でデータの変更を行わなければなりません。
トランザクション A とトランザクション B がデータを共有している場合、トランザクション A で変更中のデータを、トランザクション B で処理することは認められないということです。トランザクション A が終了し、データが確定した後であればトランザクション B でデータを処理することができます。持続性 (DURABILITY)
トランザクションで処理されるデータの状態はトランザクションが終了するまで変化しないということです。トランザクションで処理を変更する SQL 文を実行しますが、トランザクションの最後で変更を確定するまでは実際のデータの変更は行われないということです。
これらのトランザクションの特性により、データベースへの同時アクセスを制御したり、障害発生時の処理を制御することができるようになります。それぞれ、例をあげて説明します。
トランザクションの必要性
10 万円の引き算と 10 万円の足し算を、分割出来ない1つの処理として扱い、もし 10万円の足し算が失敗したら 10 万円の引き算も取り消されるようにするのです。このように、複数の処理をまとめて扱う機能がトランザクションです。
トランザクションを始めてから、結果をデータベースに反映させることをコミット(COMMIT)、また反映せずに、元に戻すことをロールバック(ROLLBACK)といいます。
トランザクションにおけるロック
DDL 文(ALTER CREATE DROP)を実行したとき
接続を切断(異常終了)したとき
↓
終了してしまう。
このロック機能により、Oracle では、A さんが SELECT しているとき、B さんが UPDATEすることによって SELECT の内容が途中で変わってしまう、あるいは後で ROLLBACK されたので、意味のないデータを SELECT してしまうといったことは起こりません。常に、整合性のある確実なデータが読み取れるという特徴、これを読み取り一貫性と呼びます。Oracle は古くから、この読み取り一貫性が強みです。
自動コミット機能
Oracle では、DML 文(SELECT、INSERT、UPDATE、DELETE)が実行されても自動的にコミットはしません。逆に、DDL 文(ALTER、CREATE、DROP)が実行された場合は自動的にコミットされます。
DML 文を実行すると自動的にコミットされてしまうことを自動コミット機能といいます。
Oracle では、デフォルトではこの自動コミット機能はオフの状態になっているのですが、これをオンにして、UPDATE、INSERT、DELETE を実行すると、自動的にすぐにコミットする設定にも出来ます。