MySQL で分散ロックを使用して同時アクセスを制御するにはどうすればよいですか?
データベース システムでは、同時アクセスが多いことが一般的な問題であり、分散ロックは一般的な解決策の 1 つです。この記事では、MySQL で分散ロックを使用して同時アクセスを制御する方法を紹介し、対応するコード例を示します。
1. 原則
分散ロックを使用すると、共有リソースを保護し、同時に 1 つのスレッドのみがリソースにアクセスできるようにすることができます。 MySQL では、分散ロックは次の方法で実装できます。
2. 実装手順
MySQL で分散ロックを使用する手順は次のとおりです:
ステップ 1: lock_table の作成
最初に、lock_table Table という名前のテーブルを作成します。ロック状態を保存するために使用されます。テーブルは次のように定義されます。
CREATE TABLE lock_table
(
id
INT NOT NULL AUTO_INCREMENT,
lock_name
VARCHAR( 64) NOT NULL,
lock_holder
VARCHAR(64) DEFAULT NULL,
status
INT DEFAULT '0',
created_time
TIMESTAMP DEFAULT CURRENT_TIMESTAMP、
主キー (id
)、
一意のキー lock_name
(lock_name
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ステップ 2: 分散ロックを取得する
次は分散ロックを取得するコード例です:
START TRANSACTION;
SELECT * FROM lock_table WHERE lock_name = ' my_lock' FOR UPDATE;
-- 他のスレッドがすでにロックを保持しているかどうかを判断します
SELECT * FROM lock_table WHERE lock_name = 'my_lock' AND status = 1;
-- 他にロックがない場合スレッドがロックを保持している ロックを持っている場合は、自分自身をロックの所有者として設定し、ロックのステータスを 1
INSERT INTO lock_table (lock_name, lock_holder, status) VALUES ('my_lock', 'thread_id', 1);
COMMIT;
ステップ 3: 分散ロックを解放する
スレッドが共有リソースの操作を完了したら、分散ロックは時間内に解放される必要があります。以下は分散ロックを解放するコード例です:
START TRANSACTION;
SELECT * FROM lock_table WHERE lock_name = 'my_lock' FOR UPDATE;
-- Determine if現在のスレッド ロックを保持しています
SELECT * FROM lock_table WHERE lock_name = 'my_lock' AND lock_holder = 'thread_id';
-- 現在のスレッドがロックを保持している場合は、ロック ホルダーとステータスを null に設定しますおよび 0
UPDATE lock_table SET lock_holder = NULL、status = 0 WHERE lock_name = 'my_lock' AND lock_holder = 'thread_id';
COMMIT;
3. Notes
In When分散ロックを使用する場合は、次の点に注意する必要があります。
4. 概要
この記事では、分散ロックを使用して MySQL での同時アクセスを制御する方法を紹介し、対応するコード例を示します。分散ロックは、同時アクセスが多い問題を解決するために一般的に使用される方法ですが、分散ロックを使用する場合は、長時間のトランザクションやデッドロックを避けるために注意が必要です。分散環境では、ロック管理とスケジューリングも考慮する必要があります。
以上がMySQL で分散ロックを使用して同時アクセスを制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。