我对在PHP中一次提交多个请求持怀疑态度。我有一个php函数,比如insertOrder()来将详细信息插入数据库表并向用户发送通知。详细信息将从另一个来源自动发布到此功能。这些是insertOrder()中的步骤
问题在于,有时系统会同时将具有相同id的数据发送到inserOrder()。此时,从OrderId=123
始终为0的数据库表中选择订单计数,以便尝试将两个post详细信息插入到数据库表中。即使我正在使用mysql事务,它也在插入重复的行。原因可能是什么?如果有人知道,请帮我整理一下。
下面是inserOrder()的两个示例数据
{orderid:123,status:pending}
{orderid:123,status:completed}
当我们第一次将数据放入insertOrder()时,数据库表中将不存在订单ID123,因此它将将其插入到数据库表中,第二次它应该更新数据库表值。因为它同时获取这两个数据,所以它将插入到数据库表中。
这是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
约束。如果使其唯一,则最后一个事务将无法提交。
为此您至少有两个选项:
ALTER TABLE table_name ADD PRIMARY KEY (id);
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (id);
请注意,允许客户端为插入的记录选择ID是不常见的。大多数时候,您应该允许DB为诸如Orders之类的实体选择下一个ID。