トランザクション内でテーブルをロックしたい。このようなもの:
_ DB::transaction(function (){
DB::statement('LOCK TABLES important_table WRITE');
//....
});
_
ただし、行DB::statement('LOCK TABLES important_table WRITE');
は常に次のエラーをトリガーします。
SQLSTATE [HY000]:一般エラー:2014他のバッファリングされていないクエリがアクティブな間はクエリを実行できません。 PDOStatement :: fetchAll()の使用を検討してください。または、コードがmysqlに対してのみ実行される場合は、PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性を設定してクエリバッファリングを有効にすることができます。 (SQL:LOCK TABLES officeSeal WRITE)
Laravelでテーブルをロックするにはどうすればよいですか?
Laravelでテーブルをロックすることができます:
DB::raw('LOCK TABLES important_table WRITE')
;
他のユーザーのコメントでも指摘されているように、テーブルロックが唯一の解決策だとは思いません。ただし、主張する場合は、Laravelの Pessimistic Locking を使用できます。つまり、ドキュメントで言及されているsharedLock()
およびlockForUpdate()
メソッドです。
ドキュメントの例では Eloquent を使用していませんが、 Query Builder に依存しています。ただし、 このQ&A はEloquentでも実行できることを示唆しているようです。
また、Laravelでの悲観的および楽観的ロックの実装と対照的な この記事 を読むことも価値があります。