MySQL MVCC 原則を理解して適用する方法
はじめに:
MySQL は、一般的に使用されるリレーショナル データベース管理システムであり、MVCC (マルチバージョン同時実行制御) 原則により、データの一貫性と同時実行性を確保します。 MVCC は、バージョン管理に基づいてデータの読み取りおよび書き込み操作を実装するトランザクション同時実行制御方式です。
この記事では、MVCC 原則の基本概念と、MySQL で MVCC を適用する方法を紹介します。
1. MVCC 原則の概要
MVCC は、同時実行性を向上させるために MySQL によって導入されたメカニズムです。ロック メカニズムなどの従来の同時実行制御方法では、トランザクションが特定のデータを変更する場合、他のトランザクションはデータを変更する前にトランザクションがロックを解放するのを待つ必要があります。このアプローチでは、大量のトランザクション待機が発生するため、同時実行パフォーマンスに影響します。
これに対し、MVCCはマルチバージョン同期制御方式を採用しており、各トランザクションはデータベースのある時点のデータ状態であるデータベースのスナップショットを参照することができます。
MVCC では、各データベース レコードにバージョン番号 (またはタイムスタンプ) があります。トランザクションがレコードを変更すると、実際には新しいバージョンのレコードが作成されます。他のトランザクションがレコードを読み取る場合、トランザクションが開始される前のバージョンのみを読み取ることができ、トランザクションによるレコードの変更操作は、他のトランザクションによるレコードの読み取り操作には影響しません。
2. MySQL での MVCC の実装
MVCC を実装するために、MySQL は各データベース行レコードの複数のバージョンを保存します。 InnoDB ストレージ エンジンでは、レコードの各行に、トランザクション ID (トランザクション ID)、作成時刻、有効期限という 3 つの非表示列が含まれています。トランザクション ID は、どのトランザクションで更新操作が行われたかを示すために使用され、作成時刻はバージョンの作成時刻を示すために使用され、有効期限はバージョンの有効時間範囲を示すために使用されます。
MySQL では、データの読み取り操作は次の 2 つのタイプに分類できます。
3. MVCC 原則の適用
MVCC 原則は広く使用されており、同じデータに対する複数の同時トランザクションの読み取りと書き込みの競合の問題を解決するために使用できます。
以下は、MVCC を使用して MySQL に同時実行制御を実装する方法を示す簡単な Python コード例です。
import threading import time import pymysql # 创建多个线程并发执行事务 def execute_transactions(): conn = pymysql.connect(host='localhost', user='root', password='password', db='test', charset='utf8mb4') cursor = conn.cursor() try: cursor.execute('BEGIN') cursor.execute('SELECT balance FROM accounts WHERE id = 1') balance = cursor.fetchone()[0] time.sleep(1) # 模拟其他事务操作 cursor.execute('UPDATE accounts SET balance = %s WHERE id = 1', (balance - 100,)) cursor.execute('COMMIT') except Exception as e: cursor.execute('ROLLBACK') print(repr(e)) finally: cursor.close() conn.close() # 创建多个线程并发执行事务 threads = [] for i in range(10): t = threading.Thread(target=execute_transactions) threads.append(t) # 启动线程 for t in threads: t.start() # 等待所有线程执行结束 for t in threads: t.join()
上記のコード例では、トランザクションを同時に実行するために複数のスレッドを作成しました。トランザクションごとにデータベースから口座残高が読み取られ、100 元が差し引かれます。 MVCC メカニズムの使用により、各トランザクションはトランザクションの開始前にデータ バージョンを読み取ることしかできず、アカウント残高の変更操作は相互に影響しません。このようにして、データの一貫性と同時実行性が保証されます。
概要:
この記事では、MVCC の原理と MySQL でのその応用について紹介します。 MVCC は、バージョン管理メカニズムを通じてデータへの同時アクセス制御を実装し、データベースの同時実行パフォーマンスを向上させます。実際のアプリケーションでは、MVCC を使用して、同じデータに対する複数の同時トランザクション間の読み取りおよび書き込みの競合の問題を解決できます。
以上がMySQL MVCC 原則を理解して適用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。