我想在PDO中对表执行操作之前锁定表,因此两个用户将无法在同一时间执行相同的操作。
我尝试了如下:
$this -> link ->beginTransaction();
$this -> link ->exec('LOCK TABLES `MYTABLE` WRITE;');
//do something...
$this -> link ->exec('UNLOCK TABLES');
$this -> link ->commit();
但如果两个用户尝试此查询,则它们都会堆叠。 我做错了什么?
谢谢!
答案 0 :(得分:0)
<?php
$this->link->beginTransaction();
$this->link->query('select yourcolumn from yourtable where yourcondition for update');
sleep(20);
$this->link->commit();
然后打开mysql工作台并尝试运行以下
begin;
select count(yourcolumn) from yourtable where yourcondition for update;
// will lock here
记住ALWAYS打开事务并在选择列数据时使用select for update
我在工作台中运行以下内容时测试了以下内容(也受锁定保护)(当上面的php脚本正在运行时)
update yourtable set yourcolumn=yourvalue where yourcondition;
// will lock here because php has obtained lock, no need to use transaction here
但是,当你在工作台中运行以下内容时,以下内容不受锁定保护(当上面的php脚本运行时)
select yourcolumn from yourtable where yourcondition;
// will immediately return resulset because you are not using transaction AND "for update"
此外,您可能会查看使用beginTransaction的所有代码,因为长时间运行的事务会导致长表锁定。例如,您只是导入文件操作中的事务。将第一条记录插入表格后,表格将被锁定。
begin;
insert into yourtable values yourvalues;
// will acquire lock here, other mysql workbench will be deadlock
// until your whole import operation is done and rollback/commit your upload