【问题标题】:Deadlock in multithread and bulk inserting into a table in MySQL [duplicate]多线程死锁和批量插入MySQL中的表[重复]
【发布时间】:2018-04-02 09:01:32
【问题描述】:

我有一个程序(在本例中为 QT)尝试通过 8 个线程将 4000 条记录同时插入到 source_names 表中:每个线程 500 条记录。

我的表如下:

CREATE TABLE `source_names` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `source_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx` (`source_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=101952 DEFAULT CHARSET=latin1;

如上面代码中所指定,我的source_name 列是UNIQUE

所以我有 8 个线程,每个线程同时执行这些代码:

INSERT IGNORE INTO source_names (source_name) VALUES ('a001'),('a002'),...,('a500')

如果有重复的source_name,则会发出警告,不会发生任何事情。

但主要的问题是有时会出现Deadlock 错误,我无法处理:

Deadlock found when trying to get lock; try restarting transaction QMYSQL3: Unable to execute statement

我认为这是因为UNIQUE 列。如果我只使用一个线程没有问题,但是如何使用多个线程来解决呢?

【问题讨论】:

    标签: mysql multithreading qt deadlock


    【解决方案1】:

    来自 MySQL 参考手册 https://dev.mysql.com/doc/refman/5.7/en/concurrent-inserts.html

    如果有多个 INSERT 语句,它们将与 SELECT 语句同时排队并按顺序执行。

    由于 MySQL 不会同时插入记录,所以可以使用单线程,避免死锁。

    如果您必须有多个插入线程,请考虑使用 try-catch 块。 如果发生死锁,请尝试再次插入。 如果您最终陷入无限循环,请放置一个计数器并且不要尝试永远插入。而是尝试仅插入您预定义的时间(计数器)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2013-05-04
      • 1970-01-01
      相关资源
      最近更新 更多