Yukiです。
今日はトランザクションについて勉強します。
ACIC特性
ACID特性については知ってましたが、何の略か聞かれるととっさに出てこないかも。
この際、ちゃんと覚えておいた方がよさそうです。
- Atomicity (原子性)
- Consistency (整合性)
- Isolation (分離性)
- Durability (持続性)
トランザクションを制御するコマンド
トランザクションを開始、終了するのに同じ意味のコマンドが複数あるのがややこしいです。きちんと覚えておきましょう。プロジェクトで使うときは、コーディング規約で統一したいですね。
開始
- BEGIN
- START TRANSACTION
終了
- COMMIT
- END TRANSACTION
- END ※PostgreSQL独自構文
中断
- ROLLBACK
- ABORT
注意点
psqlのautocommitはデフォルトON
psqlのautocommitは、デフォルトでONになっているので、START TRANSACTIONなどで明示的にトランザクションを開始しないと、SQLを実行するごとに毎回コミットされます。
間違えてもロールバックできないので、重要な処理を実行する際は、トランザクションを開始するようにした方がよさそうです。
SQLでエラーが発生すると以降の処理がすべてエラー
PostgreSQLでは、トランザクション中のSQLでエラーが発生した場合、そこでABORT扱いになり、以降の処理がすべてエラーになってしまいます。
エラーが発生した場合は、いったんABORTやROLLBACKを発行する必要があります。
トランザクションの分離レベル
トランザクションの4つの分離レベルです。他のDBMSと同様ですね。
PostgreSQLのデフォルトはREAD COMMITEDです。
- READ UNCOMMITED
- READ COMMITED
- REPEATABLE READ
- SERIALIZABLE
ロック
行ロック
SELECT文実行時に「FOR UPDATE」や「FOR SHARE」で行ロックが取得できます。
もちろん、UPDATEやDELETE実行時にも行ロック(排他ロック)が取得できます。
テーブルロック
LOCK TABLE <テーブル名> [<ロックモード>];
LOCK TABLE文でテーブル単位でロックを取れます。
なお、ロックモードを省略すると、一番強い「ACCESS EXCLUSIVE MODE」でロックされます。他からSELECTもできなくなるので、要注意です。
デッドロック
デッドロックは他のDBでもおなじみですね。
PostgreSQLでも、デッドロックを自動で検知し、デッドロックが起きているトランザクションをABORTします。
どちらのトランザクションをABORTするかはPostgreSQL任せのようです。
Oracleだとどちらがロールバックされるか決まっていたような…
まとめ
今日はトランザクションについて、勉強しました。
これでOSS-DB Silverの範囲は一通り勉強したことになります。
明日は、いよいよ緑の本の模擬試験に挑戦します。
Photo by Sergi Ferrete on Unsplash
コメント