ホームページ  >  記事  >  データベース  >  MySQL トランザクション関連の知識の詳細な紹介 (コード例)

MySQL トランザクション関連の知識の詳細な紹介 (コード例)

不言
不言転載
2019-02-01 10:39:262723ブラウズ

この記事では、MySQL トランザクション関連の知識 (コード例) を詳しく紹介します。必要な方は参考にしてください。助けてくれた。

MySQL トランザクションとトランザクション分離レベル

MySQL トランザクションは、主に大規模な操作と高度に複雑なデータを処理するために使用されます。例えば、人事管理システムにおいて、個人を削除すると、その個人の基本情報が削除され、メールボックスや記事など、その個人に関連する情報も削除されます。これらのデータベース操作文がトランザクションを構成します。 (推奨コース: MySQL チュートリアル )

    • MySQL では、Innodb データベース エンジンを使用するデータベースまたはテーブルのみがトランザクションをサポートします

    • トランザクション処理を使用すると、データベースの整合性を維持し、SQL ステートメントのバッチがすべて実行されるか実行されないかを確認できます。

    • トランザクションは、挿入、 update および delete ステートメント

  • 一般に、トランザクションはアトミック性、一貫性、分離性、耐久性という 4 つの条件を満たす必要があります

    • #原子性: トランザクション内のすべての操作は、すべて実行されるか、何も実行されず、途中で終了しません。トランザクションの実行中にエラーが発生した場合は、トランザクションの開始前の状態にロールバックされます。

    • 整合性: トランザクションの開始前とトランザクションの開始後トランザクションが終了しても、データベースのセックスの整合性は損なわれません。これは、書き込まれるデータが、データの精度や連結など、事前に設定されたすべてのルールに完全に準拠する必要があり、後続のデータベースがスケジュールされた作業を自発的に完了できることを意味します

    • 分離特徴: データベースでは、複数のトランザクションが同時にデータを読み取り、書き込み、変更できます。分離により、複数のトランザクションが同時に実行される場合のクロス実行によるデータの不整合を防ぐことができます。トランザクション分離は、非コミット読み取り、コミット読み取り、反復可能読み取り、シリアル化可能など、さまざまなレベルに分割されます。

    • 永続性:トランザクション処理完了後のデータの変更は次のとおりです。

# MySQL コマンドラインのデフォルト設定では、トランザクションは自動的に送信されます。 COMMIT 操作は、SQL ステートメントの実行直後に実行されます。したがって、トランザクションを明示的に開始するには、コマンド BEGIN または START TRANSACTION を使用するか、コマンド SET AUTOCOMMIT=0 を実行して現在のペイントの自動送信の使用を無効にする必要があります。

トランザクション制御ステートメント:

  • BEGIN または START TRANSACTION; 明示的にトランザクションを開始します

  • COMMIT を使用することもできます。 WORK、どちらも同等です。

    COMMIT はトランザクションをコミットし、データベースに対するすべての変更を永続的にします。

  • ROLLBACK; また、同等の ROLLBACK WORK を使用することもできます。

    ロールバックはユーザーのトランザクションを終了し、進行中のコミットされていない変更をすべて元に戻します。

  • SAVEPOINT 識別子。トランザクションには複数の SAVEPOINT を指定できます。

  • RELESE SAVEPOINT 識別子;
  • 指定されたセーブ ポイントがない場合、このステートメントを実行すると例外がスローされます。

  • ROLLBACK TO識別された;
  • トランザクションをマークされたポイントにロールバックします

  • SET TRANSACTION に使用されます。トランザクションの分離レベルを設定します。
  • InnoDB ストレージ エンジンは、READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE のトランザクション分離レベルを提供します

    MySQL トランザクション処理には 2 つの主な方法があります。

BEGIN、ROLLBACK、COMMIT を使用して実装する
    BEGIN
  • トランザクションを開始する

    ROLLBACK
  • トランザクションのロールバック
  • COMMIT
  • トランザクションの確認
  • SET を直接変更するMySQL 自動送信モード:
  • SET AUTOCOMMIT=0 は自動送信を無効にします
    • SET AUTOCOMMIT=1 は自動送信をオンにします

    • トランザクションの 4 つの主要な特性の 1 つ: 分離

    トランザクション A とトランザクション B の間にはある程度の分離があります

    1. read uncommitted Read uncommitted

    2. #この分離レベルでは、すべてのトランザクションが他のコミットされていないトランザクションの実行結果を確認できます。この分離レベルは実際のアプリケーションではほとんど使用されません。コミットされていないデータの読み取りはダーティ データと呼ばれます
    • read COMMIT
  • ほとんどのデータベース システムのデフォルトの分離レベル (ただし、そうではありません) MySQL)。トランザクションは、コミットされたトランザクションによって行われた変更のみを確認できます。ダーティ リードは回避されますが、ノンリピータブル リードとファントム リードに関する問題は依然として残ります
    • リピータブル リード
      • MySQL のデフォルト レベルでは、データを同時に読み取るときに、同じトランザクションの複数のインスタンスが同じデータ行を参照できるようになります。ダーティ リードと非反復読み取りは回避されますが、ファントム リードという別の問題が発生します。ファントム読み取りとは、ユーザーが特定の範囲のデータ行を読み取るときに、別のトランザクションがその範囲に新しい行を挿入し、その範囲内のデータ行を再度読み取ると、新しいファントム行が見つかることを意味します。 InnoDB と Falcon ストレージ エンジンは、マルチバージョン同時実行制御 (MVCC) メカニズムを通じてこの問題を解決します。

      • MVCC メカニズムは、Repeatable Read の分離レベルで使用され、選択操作は更新されません。バージョン番号は読み取りのスナップショット (履歴バージョン) です。挿入、更新、および削除では、現在の読み取り (現在のバージョン) であるバージョン番号が更新されます。

        serializable
    • 最高の分離レベルでは、トランザクションが互いに競合しないように強制的にソートすることで、ファントム読み取りの問題を解決します。つまり、読み取られた各データ行に共有ロックが追加されます。このレベルでは、多数のタイムアウトとロック競合が発生する可能性があります
      • トランザクション分離レベルを設定します

      my.cnf ファイル

    1. - READ-UNCOMMITTED
      - READ-COMMITED
      - REPEATABLE-READ
      - SERIALIZABLE
      * 例如
      [mysqlId]
      transaction-isolation = READ-COMMITTED

    2. コマンドによる分離レベルの動的設定
    1. SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>
      其中isolation-level可以是:
      - READ UNCOMMITTED
      - READ COMMITTED
      - REPEATABLE READ
      - SERIALIZABLE
      
      GLOBAL|SESSION表示事务隔离级别的作用范围:
      GLOBAL:表示对所有会话有效
      SESSION:表示对当前会话有效

      トランザクションの同時実行の問題

    ダーティ読み取り: トランザクション A はトランザクション B によって更新されたデータを読み取り、その後 B は操作をロールバックします。その後、A によって読み取られたデータはダーティ データです

    1. Non-repeatable read: トランザクション A は同じデータを複数回読み取り、トランザクション B はデータを更新しますが、トランザクション A の複数回の読み取り中にそれをコミットしません。その結果、トランザクション A は同じデータを複数回読み取り、結果は次のようになります。 inconsistent

    2. ファントム読み取り: 前後で読み取ったデータ数が異なります。これは、トランザクション A の複数読み取り中に、トランザクション B がテーブル

    3. # に対して挿入または削除操作を実行するためです。

    以上がMySQL トランザクション関連の知識の詳細な紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。