Laravel 5.1的表锁定问题

时间:2015-07-23 08:48:57

标签: mysql laravel laravel-5 eloquent

我无法使用此查询锁定MySQL表:

DB::statement('LOCK TABLES imports WRITE');

它给出了这些例外:

[Illuminate\Database\QueryException]
  

SQLSTATE [HY000]:常规错误:2014无法执行查询   其他未缓冲的查询处于活动状态。考虑使用   PDOStatement对象::使用fetchall()。或者,如果您的代码只是永远   要对mysql运行,您可以通过设置启用查询缓冲   PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性。 (SQL:LOCK TABLES   进口WRITE)

使用PDO时会发生同样的错误。

我应该如何使用它?

2 个答案:

答案 0 :(得分:6)

如果要锁定整个表并且想要使用LOCK TABLES table_name WRITE,则应以这种方式调用DB::unprepared('LOCK TABLES imports WRITE');,但如果您只想对所选行应用锁定,则使用{{ 1}}或sharedLock()是正确的方法,因此它将返回并仅锁定所选行。

答案 1 :(得分:3)

// prevent rows from being modified until you're finished
DB::table('imports')->where('total', '>', 10)->sharedLock()->get();

使用lockForUpdate()来防止使用其他共享锁修改或选择行。