" START TRANSACTION"在MySQL中导致连接超时

时间:2017-06-08 11:10:34

标签: mysql

我有一个名为clone的功能,我必须将数百万条记录从一个项目复制到另一个项目(多个表)。为此我使用MySQL的存储过程。

DROP PROCEDURE IF EXISTS `clone_new`;
DELIMITER $$

CREATE PROCEDURE `clone_new`(
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    SHOW ERRORS;
  ROLLBACK;
END;
START TRANSACTION;

INSERT INTO XXX SELECT * FROM XXXX ....
.....
.....

COMMIT;
    END $$

DELIMITER ;

这里的问题是没有START TRANSACTION;插入发生的速度很慢,但是由于START TRANSACTION; MySQL在该事务完成之前锁定了该表。这导致其他客户Connection Timeout

如果发生任何错误,

START TRANSACTION;需要进行回滚。

如何在不影响其他用户的情况下获得性能?

注意:我们正在使用innodb表。

1 个答案:

答案 0 :(得分:0)

我已将Isolation LevelREPEATABLE READ更改为READ COMMITTED来解决此问题。

我找到了这份文件。

  

REPEATABLE READ中,在交易期间获得的每个锁都被保留   在交易期间。

     

READ COMMITTED中,释放与扫描不匹配的锁   STATEMENT完成后。