由于上两天项目中发现了死锁,经查询是外键未加索引导致,然后又查询出了这张表是个热表,会频繁的进行插入、删除动作,且每次插入前会将之前相同业务主键下的所有记录删除,就有同事提出来在表上加一个FLAG字段(0或1),把应用中的删除动作修改为更新FLAG(从0更新到1),只进行插入(FLAG = 0),然后做一个job定时FLAG = 1的记录,这样可以减少数据库的开销。这样搞了之后发现这张表每天会增长600万的数据,在job执行删除动作的时候,应用的更新、插入被阻塞!
想问问大家,删除的时候是按照FLAG = 1进行删除的,应用中的更新、插入都是只会对FLAG = 0的记录进行操作,oracle的DML锁不是行级锁吗?删除的时候为什么会导致更新和插入的阻塞呢?另外向这种并发很高、行为上很像临时表(但是不是临时表,会有其他会话读取这张表的记录)的表进行操作时,应该怎么处理比较好?