【问题标题】:Prevent Multiple INSERT in MySQL from API从 API 防止 MySQL 中的多个 INSERT
【发布时间】:2017-06-05 17:36:40
【问题描述】:

我有一个 MySQL MyISAM 表“事务”。

架构类似于:

+-----+--------+-------------------+---------------------+
| id  | amount | duplication_check |        date         |
+-----+--------+-------------------+---------------------+
| 123 |     80 |         123456789 | 2017-06-05 11:12:23 |
| 124 |     80 |         123456788 | 2017-06-05 11:12:23 |
+-----+--------+-------------------+---------------------+

duplication_check 可以为空/null,但如果它是从脚本(例如从 API 调用)传递的,我的 PHP 代码将执行一个简单的检查:

SELECT id FROM transaction WHERE duplication_check == 'passed_from_external'.

如果这返回结果,那么事务当然失败了。

现在,我自己开发了一个 Android 应用程序,它使用 - 当通过 API 提交交易时 - 这个 duplication_check(我使用 time() 函数生成它)。

当智能手机失去连接时,我可以在不同的秒内读取 API 日志(记录 API 调用的另一个表)2 或 3 次,API 调用我的服务器 2-3 次,重复代码相同。

不幸的是,INSERT 调用已完成 3 次。但是,通过 PHP 测试,我无法复制该错误(以下调用相同的 duplication_check 失败)。

API 日志示例(注意 3 个不同的日期):

+--------+--------+-------------------+---------------------+
| id_api | amount | duplication_check |        date         |
+--------+--------+-------------------+---------------------+
|    123 |     80 | AAAAAAA           | 2017-06-05 11:12:23 |
|    124 |     80 | AAAAAAA           | 2017-06-05 11:12:25 |
|    125 |     80 | AAAAAAA           | 2017-06-05 11:12:27 |
+--------+--------+-------------------+---------------------+

交易结果(注意 API 日志旁边的 3 个相同日期):

+--------+--------+-------------------+---------------------+
|   id   | amount | duplication_check |        date         |
+--------+--------+-------------------+---------------------+
| 123111 |     80 | AAAAAAA           | 2017-06-05 11:12:28 |
| 124112 |     80 | AAAAAAA           | 2017-06-05 11:12:28 |
| 125113 |     80 | AAAAAAA           | 2017-06-05 11:12:28 |
+--------+--------+-------------------+---------------------+

可能,我需要编辑 Android 应用程序以阻止多个呼叫,但是,这可能是多个 INSERT 到一个表中,是否可以阻止它们?

【问题讨论】:

  • 你为什么不用你的 duplication_check 行创建一个唯一索引?这将防止多次写入
  • @nacho 我可以编辑添加 UNIQUE 的表并插入“随机”选择的唯一代码吗?
  • 你需要一个 UNIQUE 和 NULL 列,所以当你没有任何值时,null 被承认(并且不生成重复值)。是的,您可以使用随机选择的唯一代码更改(或编辑)表格并添加(或修改)您的列。
  • 好的。如果我的“理论”是正确的,那么在哪个数据库一次执行多个 INSERT 的情况下,UNIQUE 会阻止多次写入?
  • @sineverba 谢谢。我确实复制并粘贴了答案,以便您批准它

标签: php mysql


【解决方案1】:

你为什么不用你的 duplication_check 行创建一个 UNIQUE 索引?这将防止多次写入。您将需要一个 UNIQUE 和 NULL 列,因此当您没有任何值时,将允许 null (并且不会生成重复值)。是的,您可以使用随机选择的唯一代码更改(或编辑)表格并添加(或修改)您的列。

【讨论】:

    猜你喜欢
    • 2014-08-13
    • 2011-07-04
    • 2021-05-22
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多