php - php中同时多个请求
问题描述
我对在 php 中一次提交多个请求有疑问。我有一个 php 函数说 insertOrder() 将详细信息插入数据库表并向用户发送通知。详细信息将从另一个来源自动发布到此功能。这些是 insertOrder() 中的步骤
- 启动Mysql事务
- 从orderId=123的数据库表中选择订单数(来自post数据)
- 如果 count= 0 则插入数据库表并发送通知
- 如果不为 0 则更新订单
- 犯罪
问题是有时系统会同时向inserOrder()发送相同id的数据。在那个时候,Select the order count from the database table where orderId=123
将始终为 0,以便它将尝试将两个帖子详细信息插入到数据库表中。即使我使用的是 mysql 事务,它也会插入重复的行。可能是什么原因?如果有人知道,请帮我整理一下。
以下是 inserOrder() 的两个示例数据
{orderId:123,status:pending}
{orderId:123,status:completed}
当我们第一次向 insertOrder() 获取数据时,订单 ID 123 将不会出现在数据库表中,因此它将插入到数据库表中,第二次它应该更新数据库表值。由于它同时获取两个数据,因此它正在插入数据库表中。
这是 insertOrder 的代码片段
function insertOrder()
{
$orderId = $_POST['orderId'];
try
{
start transaction
$order = select from table where orderId=$orderId
if(count($order) == 0)
Insert the order
commit
else
update order where orderId=$orderId
}
catch()
{
rollback
}
}
解决方案
如果您可以插入具有重复 ID 的行,那么您对此列没有UNIQUE
约束。如果你让它唯一,那么最后一个事务将无法提交。
为此,您至少有两种选择:
- 主键通常用于 ID 列。见https://en.wikipedia.org/wiki/Primary_key
ALTER TABLE table_name ADD PRIMARY KEY (id);
- 只是一个独特的约束:
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (id);
请注意,允许客户端为插入的记录选择 ID 是不常见的。大多数情况下,您应该允许数据库为订单等实体选择下一个 ID。
推荐阅读
- python - 使用 docker 开发时运行预提交挂钩(例如 pylint)
- flutter - 许多 BlocListener 在 Flutter 上注册了 Navigation.pushName()
- python - 为什么我在 Django 中收到“MySQL 服务器已消失”异常?
- sonarqube - SonarQube 7.1 - Debian 安装 - 连接被拒绝
- ruby-on-rails - 弃用警告:ActionView::Base 实例应使用查找上下文、分配和控制器构造
- php - 根据用户选择跨多个页面显示正确的下载表单
- docker - docker-compose.yml 不会读取主机名的环境变量
- spring - 如何注册外部注释以供弹簧验证使用
- python - 格式化 yaml 以包含嵌套字典?
- react-native - 抽屉中的图像不显示在 react-native