mysql - Laravel lockForUpdate + 事务
问题描述
我们像这样使用 lockForUpdate :
DB::beginTransaction();
try {
$balance = UserBalance::where('user_id', 2)
->lockForUpdate()
->first();
$balance->usd += 100;
$balance->save();
// A LOT MORE LOGIC HERE
$balance = UserBalance::where('user_id', 7)
->lockForUpdate()
->first();
$balance->usd -= 100;
$balance->save();
} catch (\Exception $e) {
DB::rollback();
return json_encode ([
'success' => false,
'message' => 'error',
]);
}
DB::commit();
一切正常,我在提交之前尝试了一些“睡眠(20)”并发送了另一个申请(没有睡眠)并且该行确实被锁定,但我们面临一个问题。当我们从 cron 多次运行它时,似乎该函数运行在完全相同的毫秒上,然后锁似乎不起作用,这可能吗?除了使用队列之外,还有其他解决方案吗?
CRON 只是像这样多次调用路由:
* * * * * curl http://test.com.br/test
* * * * * curl http://test.com.br/test
* * * * * curl http://test.com.br/test
解决方案
我不明白为什么你需要DB::transcation
在这里使用 a ,因为这个操作是一个原子操作。
你可以简单地做一个UserBalance::where('user_id', 2)->increment('usd', 100)
.
这将向后端发送一个查询,将值递增usd
100。
推荐阅读
- ios - 如何查看 GoogleSignIn 用户上传的图片或谷歌设置的默认图片
- javascript - Javascript双定时器
- windows - 无法 cd 到 exe 程序返回的目录
- function - 使用函数获取组合
- javascript - 选择一个列表以生成另一个列表
- sql - 记录数正确显示,但当日期是相当旧的日期时,“新计算开始日期”列显示所有“######”格式,例如:01-DEC-1184
- excel - 如何用另一个工作表中关于另一个单元格值的另一个单元格信息有条件地替换excel中的单元格信息
- php - 通过字符串操作从另一个创建新变量
- python - 我正在学习 python,所以写了这个小代码来添加 2 个具有 ROI 的图像,但它显示错误
- mesos - OpenEBS 是否支持或有任何适用于 DCOS 或 MESOS 的插件?