gpt4 book ai didi

mysql - 选择查询 block 对事务表进行读/写/更新操作

转载 作者:行者123 更新时间:2023-11-29 15:07:12 30 4
gpt4 key购买 nike

我有一个 Select 查询,该查询在具有超过 400 万条记录的事务表上执行。每当我执行此查询时,我都会观察到该特定事务表上的所有写入和更新操作都会暂停,并且我们开始从 Java 端收到锁等待超时超过的异常,请尝试重新启动事务。当前锁定等待超时设置为 200 秒。我无法理解为什么 select 语句可以在表上创建此类锁并阻止所有插入/更新语句。表存储引擎为InnoDb,主键为自增键。 MySQL 版本是 5.1.40。执行此查询时我没有开始任何事务

有什么想法吗?

这是查询

选择 cd.acc_id accId, Actor (cd.ci_time作为日期)trdate, 合并(cd.cnumber,替换(cd.executer_id,'+',''))为cno, 案件 何时合并(cd.language, '英语') = '英语' 然后 1 其他2 END 作为语言, 案件 当 cd.cnumber 为空时 然后“N” 否则'Y' 结尾 伊斯克诺, 替换(cd.executer_id,'+','')executer_id, 计数(*) trcount, 总和(合并 ( ( 选择 计数(DISTINCT distribution_log.dist_id) 从 分布日志, 分布日志详细信息 在哪里 distribution_log.distribution_log_id = distribution_log_detail.distribution_log_id AND distribution_log_detail.service_id 不在 ('P1', 'P3') 中 和 distribution_log.state_id = '注册' AND distribution_log.dist_id = cd.dist_id ) , 0 ) ) accAbandond期间, 和( 案件 何时合并 ( ( 选择 计数(DISTINCT distribution_log.dist_id) 从 分布日志 在哪里 分布日志.acc_id = 58 AND distribution_log.dist_id = cd.dist_id 和 distribution_log.state_id = '注册' ) ,0 )

0 THEN 0 ELSE 1 END ) accAbandonedbef, Sum(coalesce ( ( SELECT COUNT(*) FROM cq_detail cqd WHERE cqd.dist_id = cd.dist_id ) ,0 ) ) AS opted_for_csr, Sum(coalesce ( ( SELECT count(DISTINCT cqd.dist_id) FROM cq_detail cqd, ca_detail cad WHERE cqd.dist_id = cd.dist_id AND cad.dist_id = cd.dist_id GROUP BY cqd.dist_id HAVING SUM(cad.agent_answered_flag) > 0 ) ,0 ) ) AS csr_trs_ans, Sum(coalesce ( ( SELECT count(DISTINCT cqd.dist_id) FROM cq_detail cqd WHERE cqd.dist_id = cd.dist_id AND FAnswer(cqd.dist_id) = 0 AND time_to_sec(timediff(cqd.cq_end_time, cqd.cq_init_time)) < 60 ) ,0 ) ) AS abon_at_csr_und, Sum(coalesce ( ( SELECT count(DISTINCT cqd.dist_id) FROM cq_detail cqd WHERE cqd.dist_id = cd.dist_id AND FAnswer(cqd.dist_id) = 0 AND time_to_sec(timediff(cqd.cq_end_time, cqd.cq_init_time)) >= 60 ) ,0 ) ) AS abon_at_csr_abv, Sum(coalesce ( CASE WHEN ( SELECT count(DISTINCT distribution_log.dist_id) FROM distribution_log, distribution_log_detail WHERE distribution_log.distribution_log_id = distribution_log_detail.distribution_log_id AND distribution_log_detail.service_id = 'P1' and distribution_log_detail.resp_code = '00' AND distribution_log.dist_id = cd.dist_id ) 0 THEN 1 END , 0 ) ) AS acc_successful, Sum(coalesce ( CASE WHEN ( SELECT count(DISTINCT distribution_log.dist_id) FROM distribution_log, distribution_log_detail WHERE distribution_log.distribution_log_id = distribution_log_detail.distribution_log_id AND distribution_log_detail.service_id = 'P1' and distribution_log_detail.resp_code <> '00' AND distribution_log.dist_id = cd.dist_id ) 0 THEN 1 END , 0 ) ) AS acc_unsuccessful FROM tr_detail cd WHERE cd.acc_id = 58 AND cd.ci_time >= '2009/11/05' AND cd.ci_time < Cast('2009/11/05' as date)+1 GROUP BY 1,2,3 limit 1;

最佳答案

如果您的事务隔离级别为 REPEATABLE READ 或更低,则 SELECT 语句不会创建锁,除非您使用“FOR UPDATE”。

检查您的 txn 隔离级别是多少。

无需使用 READ UNCOMMITTED,甚至无需使用 READ COMMITTED。只要避免可串行化即可。

另一方面,select 语句仍然会消耗资源,这可能会影响机器的行为。

您是否对 4M 行表进行全表扫描?

关于mysql - 选择查询 block 对事务表进行读/写/更新操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1741572/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com