解决INSERT INTO SELECT NOT EXISTS时的MySQL死锁

eyh26e7m  于 2023-01-16  发布在  Mysql
关注(0)|答案(2)|浏览(511)

我已经在网上搜索了几个小时,但我不知道如何解决这个问题。简单来说,客户向我们的系统提交订单,他们可以提供客户证明,如果该客户证明已经存在,我们的系统将拒绝该客户证明。
我不能使MySQL中的列UNIQUE作为不同的客户有时使用相同的客户参考,我们不需要客户参考,所以有时它只是留空。
最初,我只是检查客户参考是否存在(如有必要),如果不存在,则插入该行。这在99.99%的情况下有效,但我有一个批量发送订单的客户,这些订单有时会有重复。由于他们发布得很快,选择可能发生在第一次插入和重复出现之前。
我已经切换到如下代码:(例如,缩短后,仅当customerReference不为空时才运行)

INSERT INTO ordersTable (clientID,customerReference,deliveryName) SELECT clientID, customerReference,deliveryName
    FROM (SELECT 'clientID' as clientID, 'customerReference' as customerReference, 'deliveryName' as deliveryName) t
    WHERE NOT EXISTS (SELECT 1 FROM ordersTable u WHERE u.customerReference = t.customerReference AND u.clientID = t.clientID);

在插入原始行后,这会导致任何进程死锁。我希望避免死锁?
我的选择似乎是:
1.让它死锁,因为我知道如果它死锁,那么行已经存在,而不是查看affected_rows ==0,使它affected_rows〈= 0。
1.尝试根据客户ID和Customer Reference为每个订单创建一个唯一的记录散列,然后对该列执行“INSERT IGNORE”操作。
我对这两个解决方案都不太有信心,所以我想先征求一下意见也无妨。

xxe27gdn

xxe27gdn1#

您是否尝试过使用对uniqueID和clientID列具有唯一约束的事务?这将防止插入重复项,并且您可以捕获在尝试插入复制时引发的异常,并根据需要进行处理。

INSERT INTO ordersTable (clientID,uniqueID,deliveryName)
VALUES ('clientID', 'uniqueID', 'deliveryName')
ON DUPLICATE KEY UPDATE deliveryName = VALUES(deliveryName);
8dtrkrch

8dtrkrch2#

好的,你也可以使用“INSERT IGNORE”语句,这个语句告诉服务器插入新记录,但是如果违反了UNIQUE索引或PRIMARY KEY,忽略错误,不插入新记录。

INSERT IGNORE INTO ordersTable (clientID,uniqueID,deliveryName)
VALUES ('clientID', 'uniqueID', 'deliveryName');

相关问题