mysqlのTQL(Transaction Control Language)


文書ディレクトリ
  • トランザクションの概念
  • ストレージエンジン
  • トランザクションのプロパティ
  • トランザクションの独立性レベル
  • トランザクションの概念
    トランザクションは、mysql文ごとに依存する個別のセルの1つ以上のsql文で構成されます.ユニット全体が分割できない全体として、ユニット内のsql文が実行に失敗したり、エラーが発生したりすると、ユニット全体がロールバックされ、ユニット内のすべてのsql文が成功すると、トランザクションが実行されます.
    ストレージエンジン
    mysqlには異なるストレージエンジンが存在し、異なる技術を使用してデータベースにデータを格納します.mysqlでサポートされているストレージエンジンはshow enginesで表示できます.典型的なストレージエンジンには2つのinnodbがトランザクションをサポートしており、myisamはトランザクションをサポートしていません.
    トランザクションのプロパティ
    ACDI
  • 原子性(Atomicity):原子性とは、トランザクションが分割できない作業単位であり、トランザクション内の操作が発生するか、発生しないかを意味します.
  • コンシステンシ(Consistency):トランザクションは、1つのコンシステンシの状態から別のコンシステンシの状態に変換する必要があります.例:aがbに100元あげると、aは-100、bは+100となります.この2つのことは同時に発生しなければなりません.事務の一致性と呼ばれます.
  • 独立性(Isolation):トランザクションの独立性とは、1つのトランザクションの実行が他のトランザクションに干渉されないことを意味します.
  • 永続性(Durability):永続性とは、トランザクションがコミットされるとデータベースに対する変更が永続的であることを意味します.
  • set autocommit=0;
    start transaction;
    ...
    savepoint a
    ...
    commit; rollback; rollback to a;
    

    トランザクションの独立性レベル
  • ダーティリードトランザクションAはデータベースにアクセスし、データベースに新しい牛人の名前「tom」を付けたが、トランザクションはコミットされなかった.別のトランザクションBが来て、彼はすべての牛人の名前を検索します.このとき、トランザクション間に有効な隔離がなければ、トランザクションBが返した結果に「tom」の名前が表示されます.
  • (unrepeatable read)トランザクションAはデータベースにアクセスし、IDが1の牛人の名前を表示しようとしたが、その時、トランザクションBが来て、IDが1の牛人が名前を変えたので、更新してトランザクションを提出した.次に、事務AはIDが1の牛人の名前をもう一度見たいと思っていましたが、結局、2回読んだIDが1の牛人の名前が違うとは、繰り返して読むことはできません.
  • 幻読(phantom problem)トランザクションAはデータベースにアクセスし、データベースの牛人がどれらを持っているかを見たいと思っています.トランザクションBが来て、データベースに新しい牛人を追加しました.その時、事務Aはさっきの牛人がどんな人だったか忘れて、また実行しました.結局、初めて3人の牛人がいて、2回目は4人の牛人がいました.このような状況を幻読と呼ぶ.

  • データベースには、一般的に4つの独立性レベルがあります.
  • Read uncommitted:2つのトランザクションを並列に許可します.書き込みトランザクションが1つの変更テーブルの操作を実行し、コミットされていない場合、別の読み取りトランザクションはクエリー中に変更後のテーブルを表示します.これをダーティリードと呼び、Read uncommittedでダーティリードが現れます.
  • Read committed:2つのトランザクションを並列に許可します.書き込みトランザクションが1つの変更テーブルの操作を実行し、コミットされた場合にのみ、変更後のテーブルがクエリー中に表示されます.リピート不可と呼ばれ、Read committedにリピート不可度が現れます.
  • Repeatable read:2つのトランザクションを並列に許可し、書き込みトランザクションが変更テーブル操作を実行し、コミットは実行中の読み取りトランザクションのクエリーに影響しません.書き込みトランザクションがコミットされた後の新しい読み取りトランザクションには、変更されたテーブルが表示され、Repeatable readに幻の読み取りが表示されます.
  • Serializable:2つのトランザクションの並列は許可されず、1つのトランザクションのみが実行され、複数のトランザクションが同時に実行されず、後続のトランザクションがブロックされ、前のトランザクションのコミットを待つことができます.

  • orcleはRead committedとSerializableの2種類しかありません.mysqlには以上の4つの独立性レベルがあります.