ホームページ >データベース >mysql チュートリアル >MySQL でロックせずに SELECT ステートメントを実行するにはどうすればよいですか?
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 サイトの他の関連記事を参照してください。