mysql - MySQL中的"START TRANSACTION"导致连接超时

标签 mysql

我有一个名为“克隆”的功能,其中我必须将数百万条记录从一个项目复制到另一个项目(多个表)。为此,我使用 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 对该表加了锁,直到该交易已完成。这导致其他客户端连接超时

START TRANSACTION; 需要在发生任何错误时进行回滚。

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

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

最佳答案

我通过将隔离级别REPEATABLE READ更改为READ COMMITTED解决了该问题。

我找到了这个文档。

In REPEATABLE READ every lock acquired during a transaction is held for the duration of the transaction.

In READ COMMITTED the locks that did not match the scan are released after the STATEMENT completes.

关于mysql - MySQL中的"START TRANSACTION"导致连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44434091/

相关文章:

mysql - 如何将查询结果转换为Google Chart API的格式化字符串

php - Ajax 调用的持久数据库连接

mysql - 聚合 MAX COUNT 子查询,带连接

mysql - 在 Node js代码中获取mysql查询的输出文件中的日期

php - 获取另一行 GROUP BY 行的 SUM

php - 将主 ID 保存在 MySQL 表的另一列中

php - Mysql 表挂起 - 无法保存第 149 行/home/my_site/public_html/my_file.php 中的结果集

java - 从java调用sql过程

SQL SELECT 按 2 列排序和分组

c# - 无法打开登录请求的数据库 "testdb"。登录失败