ホームページ >データベース >mysql チュートリアル >MySQL でロックせずに SELECT ステートメントを実行するにはどうすればよいですか?

MySQL でロックせずに SELECT ステートメントを実行するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-14 18:33:12402ブラウズ

How to Run SELECT Statements in MySQL Without Locking?

MySQL でロックを発生させずに SELECT ステートメントを実行する方法

MySQL では、特に基になるテーブルがロックされている場合、SELECT ステートメントを実行するとロックが発生することがあります。同時修正中です。これは、特にバイナリログに依存するスレーブ データベースでは問題となる可能性があります。

提供された記事で提案されている解決策の 1 つは、「NOLOCK」修飾子を利用することです。ただし、MySQL は同等のキーワードをサポートしていません。代わりに、トランザクション分離レベルを調整することで、同じ効果を得ることができます。

解決策: コミットされていないトランザクション分離レベルの読み取り

SELECT ステートメントの実行中のロックを回避するには、次のようにします。トランザクション分離レベルを「READ UNCOMMITTED」に設定します。これにより、コミットされていないトランザクションが表示され、ロックの発生を防ぐことができます。その方法は次のとおりです。

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT COUNT(online.account_id) cnt from online;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

スレーブ データベースの互換性

スレーブ データベースで READ UNCOMMITTED 分離レベルを使用すると、次のエラーが発生する可能性があります:「Binary」ログを記録できません...InnoDB のトランザクション レベル 'READ-UNCOMMITTED' は binlog モードでは安全ではありません'STATEMENT.'" これを解決するには、マスター データベースの my.cnf ファイルを変更して、バイナリログのトランザクション分離レベル「READ UNCOMMITTED」を有効にします。

代替ソリューション

または、分離を設定する代わりに次の手法を使用することもできます。 level:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT COUNT(online.account_id) cnt from online;
COMMIT;

これにより、クエリはコミットされていないデータを読み取り、すぐにトランザクションをコミットし、潜在的なロックや競合を防ぎます。

READ UNCOMMITTED 分離レベルを使用すると、コミットされていないデータは、データの不整合を引き起こす可能性があります。潜在的なリスクを考慮し、必要に応じて慎重に使用することが重要です。

以上がMySQL でロックせずに SELECT ステートメントを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。