Laravel DB :: beginTransaction导致其他事务被锁定

时间:2017-06-10 05:08:42

标签: php mysql laravel locking

在经典的php我有2个进程文件

1)process1.php =>锁定.table InnodB的行。

2)process2.php =>要从同一个表中读取另一行

我在PHP / MySQL中使用START TRANSACTION AND COMMIT,它正如我想要的那样正常工作。 我想要的是process2.php可以选择另一个记录事件,尽管process1.php仍在运行并锁定某行。

不幸的是,它在Laravel中不起作用,我的其他进程被锁定,直到第一个进程完成,而第二个进程正在选择另一个表。

请帮我解决这个问题。

DB::beginTransaction();
$rs = DB::table('test_iap')->where('content', 'waiting')->lockForUpdate()->get();

$sql = "update test_iap set content='Updated' where id=1";
DB::connection('mysql_pencil_main')->update(DB::raw($sql));
sleep(10);# To allow testing at different file process

DB::commit();

2 个答案:

答案 0 :(得分:1)

使用sharedLock()代替lockForUpdate()。共享锁可防止在事务提交之前修改所选行。查看更多说明here

DB::beginTransaction();
$rs = DB::table('test_iap')->where('content', 'waiting')->sharedLock()->get();

$sql = "update test_iap set content='Updated' where id=1";
DB::connection('mysql_pencil_main')->update(DB::raw($sql));
sleep(10);# To allow testing at different file process

DB::commit();

答案 1 :(得分:0)

问题出在睡眠。我尝试了相同的脚本,没有任何锁或事务,其他api仍等到10秒结束。 请看一下这个问题: How to sleep PHP(Laravel 5.2) in background

如果您想睡觉,可以在另一个端口上运行另一个程序,例如:

php artisan serve --port 7000

,然后在该端口上发送第二个请求。