两个用户同时提交数据,如何避免数据库重复录入?
How to avoid duplicate entry in the database if the data is submitted from two users at the same time?
我的问题有点令人困惑,我知道我的问题听起来可能与此处的其他问题相似。我有一个编号的表格,并根据数据库中的最后一个值增加 1。
例如在数据库中:
ID | ApplicationNumber
1 | 1
2 | 2
因此,如果用户生成另一个表单,它将显示为:Application Number 3
。并且它会在数据库中保存为应用程序编号 3。但是如果有两个用户同时提交表单怎么办?两者都填写了编号为:Application Number 3
的表格,在我的 INSERT INTO
执行查询以查找数据库中的最后一个值之前,我可以 +1
到应用程序编号值之前的值提交到数据库。我让两个用户同时提交表单,我在数据库中收到的是这样的:
ID | ApplicationNumber
1 | 1
2 | 2
3 | 3
4 | 3
我在向数据库中插入内容之前获取最后一个值的查询:
$query = mysqli_query($con,"SELECT table1.ApplicationNumber FROM table1 INNER JOIN table2 ON table1.AdminID = table2.AdminID AND table2.Username = '$user' ORDER BY table1.ApplicationNumber DESC LIMIT 1");
while($row = mysqli_fetch_array($query)) {
$aNumber = $row['ApplicationNumber'] + 1;
}
如果我没猜错,从数据库的角度来看,有几个简单的选项:
- 在 mysql
中的 ApplicationNumber 列使用 autoincrement
- 为此列创建 Unique-key constraint 并以某种方式处理此错误
- 您也可以在 select 之前 LOCK the table,这样您就可以独占访问数据。当心,您应该特别注意解锁并了解其他用户将无法使用此 table,同时锁定有效。
我的问题有点令人困惑,我知道我的问题听起来可能与此处的其他问题相似。我有一个编号的表格,并根据数据库中的最后一个值增加 1。 例如在数据库中:
ID | ApplicationNumber
1 | 1
2 | 2
因此,如果用户生成另一个表单,它将显示为:Application Number 3
。并且它会在数据库中保存为应用程序编号 3。但是如果有两个用户同时提交表单怎么办?两者都填写了编号为:Application Number 3
的表格,在我的 INSERT INTO
执行查询以查找数据库中的最后一个值之前,我可以 +1
到应用程序编号值之前的值提交到数据库。我让两个用户同时提交表单,我在数据库中收到的是这样的:
ID | ApplicationNumber
1 | 1
2 | 2
3 | 3
4 | 3
我在向数据库中插入内容之前获取最后一个值的查询:
$query = mysqli_query($con,"SELECT table1.ApplicationNumber FROM table1 INNER JOIN table2 ON table1.AdminID = table2.AdminID AND table2.Username = '$user' ORDER BY table1.ApplicationNumber DESC LIMIT 1");
while($row = mysqli_fetch_array($query)) {
$aNumber = $row['ApplicationNumber'] + 1;
}
如果我没猜错,从数据库的角度来看,有几个简单的选项:
- 在 mysql 中的 ApplicationNumber 列使用 autoincrement
- 为此列创建 Unique-key constraint 并以某种方式处理此错误
- 您也可以在 select 之前 LOCK the table,这样您就可以独占访问数据。当心,您应该特别注意解锁并了解其他用户将无法使用此 table,同时锁定有效。