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语句是否锁。

这样死锁就形成了。

 

posted @ 2024-04-24 09:36  xxfcode  阅读(92)  评论(0编辑  收藏  举报