我有桌子说
选项卡1
ID, TARGET, STATE, NEXT
列ID
是主键。
显示死锁的查询与此类似
SELECT *
FROM TAB1
WHERE NEXT = (SELECT MIN(NEXT) FROM TAB1 WHERE TARGET=? AND STATE=?) FOR UPDATE
我做了一个解释计划,我看到这样的东西:
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8095 | 6 (0)| 00:00:01 |
| 1 | FOR UPDATE | | | | | |
| 2 | BUFFER SORT | | | | | |
|* 3 | TABLE ACCESS FULL | TAB1 | 1 | 8095 | 3 (0)| 00:00:01 |
| 4 | SORT AGGREGATE | | 1 | 2083 | | |
|* 5 | TABLE ACCESS FULL| TAB1 | 1 | 2083 | 3 (0)| 00:00:01 |
由于查询执行 TABLE ACCESS FULL 两次,所以我怀疑执行相同查询的 2 个会话将以不同的顺序访问行。
列索引是否有助于防止死锁?说在 NEXT 上创建索引???或者通过将主键更改为非集群键?注意:通常,该表最多有 1000 行。