在经典的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();
答案 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
,然后在该端口上发送第二个请求。