10.トランザクション【OSS DB exam Silver】

OSSsilver

現在OSS-DB Silver Ver.2を勉強中のサイト主です。

OSS DB Silverを本で勉強していても図にしないとわからなかったり、表にしたほうが分かりやすいこともあります。そのため、自分が覚えにくいと思ったこと、混同しやすいことをまとめています。書いてあることは常識なことかもしれませんが私がわからなかったことをまとめています。

勉強法などは下記に記載しています。

OSS DB Silverを取得するためにやったこと

OSS DB exam Silverの勉強内容

  1. オープンソースデータベースの一般的特徴
  2. データベースの基礎知識
  3. インストール
  4. 標準付属ツール
  5. 設定ファイル
  6. バックアップとリストア
  7. 基本的な運用管理
  8. SQLとオブジェクト
  9. 組み込み関数と演算子
  10. トランザクション⇦今日はこれ!

10.トランザクション

一つの処理をトランザクションという。

トランザクションの種類

BEGIN  :トランザクションの開始します。
START TRANSACTION:トランザクションの開始します。
COMMIT :コミットしてトランザクションの終了します。
END   :コミットしてトランザクションの終了します。
ROLLBACK:トランザクションを途中停止し処理を最初からすべて取り消します。
ABORT  :トランザクションを途中停止し処理を最初からすべて取り消します。

ACID特性について

Atomicity (原子性)
それ以上分解できない単位の操作である
「変更された」か「変更されていないか」のどちらか
Consistency (一貫性、整合性)
予め定められたルールに則った(整合性の取れた)状態である
正の値しかとらない、など。
Isolation (分離性、独立性)
実行中のトランザクションが他のトランザクションに影響を与えない
実行中のトランザクションの状態を参照・変更することができない
Durability (永続性)
一度コミットされたトランザクションは、何があっても残される
障害が発生しても、コミットされたトランザクションの結果は残る

分離レベルの指定方法について

DIRTY READ

他トランザクションによって変更された、コミット前のデータを読み込んでしまう現象

FAZZY READ

  • あるデータをトランザクション内で複数回読み込んだ場合に、他トランザクションで対象データの削除がコミットされることによってデータが取得できなくなる現象
  • あるデータをトランザクション内で複数回読み込んだ場合に、他トランザクションで対象データの変更がコミットされることによって取得されるデータ内容が変わってしまう現象

PHANTOM READ:あるデータをトランザクション内で複数回読み込んだ場合に、他トランザクションでデータの挿入がコミットされることによって以前は取得されなかったデータが取得されてしまう現象

・SET文を使用した指定方法(セッション単位)

SET default_transaction_isolation TO ‘分離レベル’;

・SET文を使用した指定方法(トランザクション単位)

SET TRANSACTION ISOLATION LEVEL 分離レベル;

・トランザクションの制御コマンドを使用した指定方法(トランザクション単位)(トランザクションの開始時に指定します。)

BEGIN ISOLATION LEVEL 分離レベル;
START TRANSACTION ISOLATION LEVEL 分離レベル;

テーブルロック

テーブルに対してかけるロックです。特定のテーブルに対して処理をブロックしたい場合に使用されますが、性能が下がる可能性もあるため多用はされません。書式は以下の通りです。

LOCK [TABLE] テーブル名 IN ロックモード MODE;

【主なロックモード】

・EXCLUSIVE

他トランザクションに対して、ロック対象のテーブルへの読み取り処理のみを許可します。

・ACCESS EXCLUSIVE

他トランザクションに対して、ロック対象のテーブルへの全ての処理をブロックします。ロックモードを省略した場合にデフォルトで設定されるモードです。

行ロック

行に対してかけるロックです。

行ロックには排他ロックと共有ロックの2種類があります。排他ロックは対象の行に対して、他のトランザクションによる排他ロック、および共有ロックの取得をブロックします。共有ロックは対象の行に対して、他のトランザクションによる排他ロックの取得はブロックしますが、共有ロックの取得は許可します。

特定の行を同時に更新する際に、更新内容が上書かれて失われることを防ぐために使用されます。

・排他ロックを取得する場合

SELECT カラム名 FROM テーブル名 WHERE 条件 FOR UPDATE;

・共有ロックを取得する場合

SELECT カラム名 FROM テーブル名 WHERE 条件 FOR SHARE;

所感

一番問題でよく見たのは分離レベルです。分離レベルのデフォルト設定やRead Comittedの設定の際に防げるのはどの現象なのかなどがよく出題されました。