我想在事务内锁定表。像这样:
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中锁定桌子?
答案 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中的悲观锁和乐观锁实现方式形成了对比。