大规模插入操作防止表锁方法讨论

        今天同事们在讨论大规模插入操作时锁表导致操作超时的问题,因为最近他们有个需求要求时时都可能有插入多条纪录,同时又有程序会更新这些纪录(有多个程序会去改记录操作,也有多个程序会去插入记录),而且时时性要很高。本来考虑缓冲插入也就是先将数据仍到池子里等集满或到时间后才处理插入,以减少插入动作,也有考虑将隔离等级强行下降至行,但是这些方法都有局限性,最现时的就是DBA为他们一个程序进行单独设置。而且需求是需要同时大规模插入(现实情况是可能同时连续插入上千条)并且其他程序需要更新现有程序的。我在旁边听了一会,也想了想方法。

         考虑到当大规模连续插入纪录时数据库可能将锁等级上升(行->页->表),强制设置隔离等级是否有效不得而知,当然如果有效那是最好的结果。为了防止设置隔离等级解决不了问题,我给他们想了一个方法,将需要插入操作的表同样的复制出多张来,被复制出来的多张表结构完全一样,进行插入操作时仅对其中一张表操作,而读取却可以从任意一张表读取,这样用最简单的方法解决了锁表带来的性能问题。

        举个例子,我们有一张表tb1,包含C1,C2,C3三个字段,现在我们建出结构一样的tb2和tb3这样我们就有了3张结构完全相同的表,程序在插入操作时顺序向tb1,tb2,tb3插入,而更新后读取的程序可以从3张表中任意的表去操作数据,这样因为插入操作被分散到了多张表中,和更新操作的冲突也降低了,如果要进一步降低冲突只需要增加分流表即可。

        当然这个方法还有很多变种,比如由一张表在一段时间内被设置为仅供插入操作,那么改取操作在这个时间段内不允许在此表中执行(可以建立一张状态表纪录),还有比如大规模插入时,立刻创建出一张临时表,纪录被放在临时表中,临时表表名被纪录,读取程序从执行完成的临时表中读取数据,读完后删除临时表。

        这些方法的目的只有一个就是人为的将锁等级下降,让那些不需要为本次操作的纪录可以顺畅的读取和更新。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页