mysql - select语句可以触发mysql中表的死锁吗?
问题描述
- 下面的 SQL 在 MySQL 存储过程中。
- 该过程由 cron 作业每天在午夜运行一次,以使用结果填充报告表。
- 此过程大约需要 2 分钟才能运行。
- 请注意,
table1
有数百万条记录。 - 我把它放在午夜运行,因为白天有
INSERT
/UPDATE
交易,但不幸的是晚上也有一些交易。 - 当此过程运行时,如果有其他事务正在运行,
table1
则会发生死锁错误。
我的问题是
- 为什么
SELECT
语句会导致死锁table1
? - 在这种情况下如何避免死锁?
DROP report;
CREATE TABLE IF NOT EXISTS report AS (
SELECT
DISTINCT
companies.id company_id,
(
SELECT
SUM(`message_count`) single_phone
FROM
`table1`
WHERE
`table1`.`company_id` = companies.id
AND
`status` != 'error'
) AS single_phone,
(
SELECT
SUM(`message_count`)
FROM
`table1`
WHERE
`table1`.`company_id` = companies.id
AND
`status` != 'not error'
) AS log,
(
SELECT
SUM(`message_count`)
FROM
`table1`
WHERE
`table1`.`company_id` = companies.id
AND
`status` != 'error'
) AS log_monthly,
(
SELECT
SUM(`number_of_sms`) AS aggregate
FROM
`messages`
WHERE
`messages`.`company_id` = companies.id
) AS p_monthly
FROM
companies
INNER JOIN company_users ON companies.id = company_users.company_id
WHERE
company_users.confirmed = 1
AND
company_users.deleted_at IS NULL
);
解决方案
非常感谢您的帮助,但我发现了问题。是的,这个过程会导致表上的死锁,但问题的实际原因是我已将 ->everyMinute() 放在我的 laravel 内核中以进行计划运行。并且还有一个由另一个开发人员配置的 cron 作业,每分钟运行一次。这些将每分钟运行一次,这是死锁问题的真正原因。我已将我的内核计划更改为 ->dailyAt('02:00'); 现在问题解决了。
推荐阅读
- python - 在 re.split 中使用管道会导致发生额外的拆分
- c# - 使 Int 每秒增加 x 值
- c# - c#中带有HttpClient的客户端证书
- android - Ionic android 应用程序生产构建中的问题 - TypeError: compiler_1.isFormattedError is not a function at syntaxErrorToDiagnostics
- html - Firefox 在应用 CSS 之前呈现 HTML
- swift - 后台线程中的 SwiftUI 串行 DispatchQueue
- flutter - Flutter android 应用程序意外关闭并显示“与设备的连接丢失”消息?
- asp.net-web-api - Web API 错误 - “/api”应用程序中的服务器错误
- ios - Apple WebKit 已弃用?
- ruby-on-rails - Ruby on Rails 为下拉值创建方法“未初始化的常量”错误