php - PHP mysql数据库两个请求同时在同一张表上
问题描述
如果用户调用两个请求,检查用户余额然后执行余额操作怎么办。它会引起任何问题吗?例如这两个代码:
$user = User::find(1);
if($user['balance']>250) {
// Here for example long loop
$user->update([
'balance' => DB:raw('balance - 100')
]);
}
第二个脚本做类似的事情。可以是这样的情况:在第一个请求中,如果语句通过,然后执行长循环,同时第二个请求运行,其中有 if 检查余额,并且$user->update()
在第一个请求中执行这个 if 之前执行,所以用户可以通过 if 语句当他没有平衡?
解决方案
是的,可能是这样的情况。为避免这种情况,请使用LOCK/UNLOCK TABLE
$user = User::find(1);
if($user['balance']>250) {
User::lockTable(); // method name/use depends on your framework
// Here for example long loop
$user->update([
'balance' => DB:raw('balance - 100')
]);
User::unlockTable();
}
推荐阅读
- python - 如何在 post-init 挂钩中使用 attrs 验证器?
- python - 如何在 trimesh 中加载纹理网格?
- snowflake-cloud-data-platform - 我们如何在 Snowflake 中执行 SnowSQL 中的错误处理
- algorithm - 有效地找到 item.x > n 和 item.y < n 的数组项
- python - pycontractions 的 Pip 安装错误“错误:命令错误,退出状态为 1:”
- sql - 在特定时间从数据库中获取时间并在 Azure 中安排任务
- java - Android Studio php 连接
- python - 破折号:更新图形的数据而不是更新图形的图形?
- sql - SQL Server 中“<”附近的语法不正确
- python - Pandas 标准化或标准化按类别分组