我试图通过例子来解释我的问题。我有一个长期运行的声明,比如
UPDATE <table_A>
INNER JOIN <table_B> ON [...]
LEFT JOIN <table_C> ON [...]
LEFT JOIN <table_D> ON [...]
LEFT JOIN <table_E> ON [...]
SET <table_A>.<col_A>=X
WHERE <table_A>.<col_A>=Y AND COALESCE(<table_C>.<id>,<table_D>.<id>,<table_E>.<id> IS NULL
该语句在大表上运行(其中两个每个表包含 7+ 百万行)。更新运行 3-5 分钟。在另一个会话中以高并发完成
UPDATE <table_C> SET <col_A>=Z WHERE <id> IN ([...])
或者
DELETE FROM <table_C> WHERE <id> IN ([...])
当大UPDATE
运行时,这些并发UPDATE
并DELETES
在一两分钟后因锁定等待超时或死锁而死。所有JOIN
列都有索引(标准索引)。我已经尝试过
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
[BIG UPDATE];
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
但这无济于事。数据一致性并不是那么重要(如果它包含不再存在于...<table_A>
中的行也没问题)。最重要的是,small / s on ...正在处理中。<table_C>
<table_E>
UPDATE
DELETE
<table_C>
<table_E>