100日でPostgreSQLをマスター(21日目)~トランザクション~

PostgreSQL
※アフィリエイト広告を利用しています

 

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の範囲は一通り勉強したことになります。

明日は、いよいよ緑の本の模擬試験に挑戦します。

 

<20日目 | 目次 | 22日目>

<<1日目から読む

Photo by Sergi Ferrete on Unsplash

コメント

タイトルとURLをコピーしました