oracle select语句造成锁行的问题
1、select * from 表 where code in (1,2,3);
2、update 表 set code = 4 where code = 1;
以上两步是平时可能用到的写法,先查询在修改(理解我意思就行)。
如果在高并发的情况下,这种情况更容易发生。
select语句使用非聚族索引查询,会对非聚族索引添加共享锁,由于非聚族索引上没有select的全部数据列。查询产量表时,需要对产量表数据添加共享锁,需要等待Update语句更新完产量表后释放排他锁。即Select等待Update释放锁。
此时产量表上的Update语句更新的时候,会在聚族索引上做定位,添加排他锁和修改非聚族索引的信息,问题就出在修改非聚族索引信息的时候,需要对非聚族做索引添加排他锁。此时select语句已经在聚族索引上面添加了共享锁,需要释放后才能被添加排他锁。即update语句需要等待select语句是否锁。
这样死锁就形成了。