mysqlトランザクションの詳細


MySQLトランザクションは、主に操作量が多く、複雑度の高いデータの処理に使用されます.たとえば、請求では、受注テーブルにレコードを追加する必要があります.また、受注に関するさまざまな詳細を追加する必要があります.操作の複雑さが高く、これらの操作文はトランザクションを構成する必要があります.MySQLコマンドラインのデフォルト設定では、トランザクションは自動的にコミットされます.つまり、SQL文を実行するとすぐにCOMMIT操作が実行されます.したがって、トランザクションを明示的に開くには、コマンドBEGINまたはSTART TRANSACTIONを使用するか、コマンドSET AUTOMMIT=0を実行して、現在のセッションの自動コミットを使用しないようにします.
取引
  • MySQLでは、Innodbデータベースエンジンを使用しているデータベースまたはテーブルのみがトランザクション
  • をサポートします.
  • トランザクションは、データベースの整合性を維持し、一括SQL文がすべて実行されるか、すべて実行されないかを保証するために使用できます.
  • 一般的に、トランザクションは4つの条件(ACID):原子性(Atomicity)、コンシステンシ(Consistency)、独立性(Isolation)、持続性(Durability)
  • を満たす必要があります.
  • mysqlデフォルトは、トランザクションを自動的にコミットする
  • です.
    げんしせい
    トランザクション(transaction)のすべての操作は、すべて完了するか、すべて完了しないか、中間の一環で終了しません.トランザクションは実行中にエラーが発生し、このトランザクションが実行されたことがないように、トランザクションが開始される前の状態にロールバックされます.
    コンシステンシ
    トランザクションの開始前とトランザクションの終了後、データベースの整合性は破壊されません.これは、書き込まれた資料がすべてのプリセット規則に完全に合致しなければならないことを示しています.これは、資料の精度、直列性、および後続のデータベースが自発的に所定の作業を完了できることを含む.
    ぶんりせい
    データベースでは、複数の同時トランザクションがデータの読み書きと変更を同時に行うことができます.独立性により、複数のトランザクションが同時実行されると、クロス実行によってデータが一致しないことが防止されます.トランザクション・アイソレーションは、リード・コミット(Read uncommitted)、リード・コミット(read committed)、リピート可能リード(repeatable read)、シリアル化(Serializable)など、異なるレベルに分けられます.
    持続性
    トランザクションが終了すると、システム障害が発生してもデータの変更は永続的に行われます.
    トランザクションの独立性レベル
    独立性レベル
    ダーティリード
    繰り返し不可(NonRepeatable Read)
    ファントムリード
    未読(Read uncommitted)
    かもしれない
    かもしれない
    かもしれない
    コミット済みリード(Read committed)
    あり得ない
    かもしれない
    かもしれない
    リピート可能(Repeatable read)
    あり得ない
    あり得ない
    かもしれない
    シリアル化可能(Serializable)
    あり得ない
    あり得ない
    あり得ない
    InnoDBのデフォルトは繰返し可能読み出しレベルです
  • ①ダーティリード:ダーティリードとは、1つのトランザクションがデータにアクセスし、データが変更されたときに、この変更がデータベースにコミットされていないときに、別のトランザクションもこのデータにアクセスし、このデータを使用することを意味します.
  • ②繰り返し不可:1つのトランザクション内で同じデータを複数回読むことを意味します.このトランザクションがまだ終了していない場合、別のトランザクションも同じデータにアクセスします.では、最初のトランザクションの2回の読み取りデータの間で、2番目のトランザクションの変更により、最初のトランザクションの2回の読み取りデータが異なる可能性があります.これにより、1つのトランザクションで2回読み込まれたデータが異なるため、繰り返し不可と呼ばれます.
  • ③幻読み:最初のトランザクションは、テーブル内のすべてのデータ行に関連するテーブル内のデータを変更します.同時に、2番目のトランザクションもこのテーブルのデータを変更します.この変更は、テーブルに新しいデータを挿入することです.すると,後で最初のトランザクションを操作したユーザがテーブルに修正されていないデータ行があることに気づき,幻覚が発生したように,幻読はデータ行記録が多くなったり少なくなったりする.

  • 単純な点で彼らの違いをまとめます.ダーティリードとは、変更されていないレコードを読み取ることです.繰り返して読むことはできません.他のトランザクションによってレコードが変更されたため、あるトランザクションの2回の読み取りレコードが一致しません.幻読とは、他のトランザクションがテーブルを追加削除したため、あるトランザクションの2回の読み取りテーブルレコードの数が一致しないという問題です.
    レベル1未読(Read Uncommitted)
    ダーティ・リードを許可します.つまり、他のセッションでトランザクションの変更がコミットされていないデータが読み込まれる可能性があります.
    レベル2コミットリード(Read Committed)
    コミットされたデータのみを読み込むことができます.Oracleなど多くのデータベースのデフォルトはこのレベルです(重複しない)
    レベル3リピート可能(Repeated Read)
    繰り返し読むことができます.同じトランザクション内のクエリは、トランザクションの開始時刻に一致します.InnoDBのデフォルトレベルです.SQL規格では、この独立性レベルは重複しない読み取りを排除しますが、幻の読み取りも存在します.
    レベル4シリアルリード(Serializable)
    完全にシリアル化された読み取りは、読むたびにテーブルレベルの共有ロックを取得する必要があり、読み書きは互いにブロックされます.
    mysqlトランザクション関連コマンド
    mysqlシステムのトランザクション独立性レベルの表示
    mysql> SELECT @@global.tx_isolation;

    mysqlセッションのトランザクション独立性レベルの表示
    mysql> SELECT @@tx_isolation;
    
    --  
    
    mysql> SELECT @@session.tx_isolation;
    

    システムのトランザクション独立性レベルの設定
    mysql> set global transaction isolation level read committed;

    セッションのトランザクション独立性レベルの設定
    mysql> set session transaction isolation level read committed;  --       :READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE

    Autocommit変数の表示
    1:トランザクションの自動コミット、0:トランザクションの自動コミットなし
    mysql> select @@autocommit;

    mysqlがトランザクションを自動的にコミットしないように設定
    mysql> set autocommit = 0;

    トランザクションロールバック
    mysql> rollback;

    表示されるオープントランザクション
    mysql> start transaction;
    
    --  
    
    mysql> begin;

    セーブポイントの作成
    mysql> savepoint tem1;

    コミットトランザクションの表示
    mysql> commit;

    資料
  • Java問題収集
  • mysql公式ドキュメント
  • 転載先:https://www.cnblogs.com/tqlin/p/11507508.html