我有一个MySQL MyISAM表"transaction“。
模式类似于:
+-----+--------+-------------------+---------------------+
| 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可以是空/空的,但是如果它是从脚本(例如来自API调用)传递的,那么我的PHP代码执行一个简单的检查:
SELECT id FROM transaction WHERE duplication_check == 'passed_from_external'.如果这返回一个结果,当然事务失败。
现在,我自己开发了一个Android应用程序--当通过API提交事务时--这个duplication_check (我用一个time()函数生成它)。
当智能手机失去连接时,我可以在API日志(记录API调用的另一个表)中读取2或3次API调用,API调用我的服务器2-3次,使用相同的重复代码。
不幸的是,INSERT调用被执行了三次。但是,通过PHP测试,我无法复制这个bug (使用相同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 |
+--------+--------+-------------------+---------------------+也许,我需要编辑安卓应用程序来阻止多个调用,但是,这是否可能是一个多INSERT表,是否有可能阻止它们呢?
发布于 2017-06-09 12:10:58
为什么不用duplication_check行建立一个唯一的索引呢?这将防止多写一次。您将需要一个唯一的空列,因此当您没有任何值时,NULL就会被添加(并且不会生成一个重复的值)。是的,您可以修改(或编辑)表,并使用随机选择的唯一代码添加(或修改)列。
https://stackoverflow.com/questions/44374548
复制相似问题