php - 如何以原子方式加载新的并更新现有的 Eloquent 模型?
问题描述
在我的代码中,我有一个现有的 Eloquent 模型。我想原子地:
- 从数据库加载它的新副本,然后
- 如果其状态符合预期,则更新一列。
我写了以下代码:
private function getRefreshedAndUpdated(MyEloquentModel $old_model)
{
$id = $old_model->id;
$new_model = null;
DB::transaction(function () use ($id, &$new_model) {
$new_model = MyEloquentModel::lockForUpdate()->find($id);
if ($new_model->state !== 'READY') {
throw new \Exception('Model not ready');
}
$new_model->state = 'UPDATED';
$new_model->save();
});
return $new_model;
}
这能实现我想要的吗?
特别是,我是否保证MyEloquentModel::lockForUpdate()->find($id)
:
- 将始终从数据库中获取新的模型(跳过可能通过
$old_model
之前获取而播种的任何缓存)? - 将锁定它以防止任何更改,例如通过
$old_model
(通过pthreads)或另一个进程中的底层数据库记录?
我怀疑它会,但这是一些关键代码,所以要仔细检查。
解决方案
推荐阅读
- ios - Correct approach to specific style code for small and big iOS screen in React Native?
- android - 修复 android studio 的 android sdk 设置
- python - 如何将从 text() 小部件获得的字符串转换为 int 数据类型列表?
- javascript - 如何在 javascript 和 Node.js 中正确设置类和导出
- python - PyQt5 从 QTextEdit 获取字符格式
- python-3.x - Python - 比较偶数和奇数输入的总和?
- html - Angular 2:如何将图像放在循环内的画布上?
- java - Thymeleaf th:循环中的每个访问参数
- r - 如何对多个样本/列进行 Savitzky-Golay 过滤 (R)
- excel - 用户定义类型变量