如何用Laravel锁定表?

时间:2018-11-28 15:05:36

标签: mysql laravel locking innodb

我想在事务内锁定表。像这样:

  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:锁定表   officeSeal WRITE)

如何在Laravel中锁定桌子?

3 个答案:

答案 0 :(得分:4)

这样可以在Laravel中锁定表:

static constexpr std::size_t Product() { return 1u; } template <typename... IndexType> static constexpr std::size_t Product(std::size_t const Index,IndexType const... Indices) { return Index*Product(Indices...); } template <typename... IndexType,typename= std::enable_if_t<sizeof...(IndexType)==Dim>> mdvector(IndexType const... Indices): Data(Product(Indices...)), Extents{Indices...} {} ;

答案 1 :(得分:1)

DB :: unprepared('LOCK TABLES Important_table WRITE');这个为我工作

答案 2 :(得分:0)

正如其他用户在评论中所指出的那样,我不确定表锁绝对是唯一的出路。但是,如果您坚持要使用,则可以使用Laravel的Pessimistic Locking。如文档中所述,即sharedLock()lockForUpdate()方法。

您会注意到文档中的示例未使用Eloquent,而是依赖于Query Builder。但是,this Q&A似乎暗示也可以用Eloquent来完成。

通读this article也可能是值得的,这与Laravel中的悲观锁和乐观锁实现方式形成了对比。