【发布时间】: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 谢谢。我确实复制并粘贴了答案,以便您批准它