Laravel は、データベース トランザクションを使用するための便利で高速な方法を提供します。使用中に混乱しやすく誤解されやすい箇所にいくつか遭遇しました。ここに記録しておきます。専門家が私が間違っている箇所について指摘してくれることを願っています.
laravelのトランザクションは手動と自動の方法に分かれていますが、laravelが提供するsharedLockやlockForUpdateのロックテーブルメソッドを使用している場合、不要なトラブルやエラーを避けるため、手動での送信を推奨します。
使用中のsharedLock (共有ロック) とlockForUpdate (悲観的ロック) の違いと影響について話しましょう
sharedLock (共有ロック)
sharedLock は、使用時の SQL ステートメントと同等です *select fromtransaction_test where type = 1 lock in share mode;**
トランザクション内でsharedLockが使用されている場合にのみ有効となり、データが配置されている行がロックされます。このとき、ロックされたデータは他の操作によって変更できませんが、ロックされたデータは影響を受けませんクエリ操作に関しては、通常のクエリであっても、トランザクション内のクエリであっても、操作には影響しません。ロックされたデータは、トランザクションがコミットまたはロールバックされるまで解放されません。
lockForUpdate (悲観的ロック)
lockForUpdate は、SQL ステートメント *使用時に選択と同等です。 fromtransaction_test where type = 1 for update;**
lockForUpdate はトランザクション内でのみ有効になります。lockForUpdate を使用すると、データが配置されている行がロックされます。このとき、他のトランザクションでテーブル操作をロックしてください。現在のトランザクションが送信されるまで待機します。実行は可能ですが、非ロック テーブルと通常のクエリ操作には制限がありません。影響を受けるのは、トランザクション内で実行するロック テーブル操作のみです。
Inつまり、共有ロックであろうと悲観的ロックであろうと、影響を受けるのはトランザクション内で実行されるテーブル ロック操作だけであり、トランザクション内の通常のクエリ操作や非ロック テーブル操作には影響しません。 SQL ステートメントにインデックスが含まれる場合、悲観的ロックが関係するか共有ロックが関係するかに注意し、インデックスをクエリまたは判断の基礎として使用すると、mysql は行レベルのロックを使用して行をロックします。変更しないと、テーブル ロックを使用してテーブル全体をロックすることになるため、インデックスを使用するときは注意を払う必要があります。そうしないと、同時実行性の問題が発生します。
以上がLaravelトランザクションでの悲観的ロックの使用の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。