大規模插入操作防止表鎖方法討論

        今天同事們在討論大規模插入操作時鎖表導致操作超時的問題,因爲最近他們有個需求要求時時都可能有插入多條紀錄,同時又有程序會更新這些紀錄(有多個程序會去改記錄操作,也有多個程序會去插入記錄),而且時時性要很高。本來考慮緩衝插入也就是先將數據仍到池子裏等集滿或到時間後才處理插入,以減少插入動作,也有考慮將隔離等級強行下降至行,但是這些方法都有侷限性,最現時的就是DBA爲他們一個程序進行單獨設置。而且需求是需要同時大規模插入(現實情況是可能同時連續插入上千條)並且其他程序需要更新現有程序的。我在旁邊聽了一會,也想了想方法。

         考慮到當大規模連續插入紀錄時數據庫可能將鎖等級上升(行->頁->表),強制設置隔離等級是否有效不得而知,當然如果有效那是最好的結果。爲了防止設置隔離等級解決不了問題,我給他們想了一個方法,將需要插入操作的表同樣的複製出多張來,被複製出來的多張表結構完全一樣,進行插入操作時僅對其中一張表操作,而讀取卻可以從任意一張表讀取,這樣用最簡單的方法解決了鎖錶帶來的性能問題。

        舉個例子,我們有一張表tb1,包含C1,C2,C3三個字段,現在我們建出結構一樣的tb2和tb3這樣我們就有了3張結構完全相同的表,程序在插入操作時順序向tb1,tb2,tb3插入,而更新後讀取的程序可以從3張表中任意的表去操作數據,這樣因爲插入操作被分散到了多張表中,和更新操作的衝突也降低了,如果要進一步降低衝突只需要增加分流表即可。

        當然這個方法還有很多變種,比如由一張表在一段時間內被設置爲僅供插入操作,那麼改取操作在這個時間段內不允許在此表中執行(可以建立一張狀態表紀錄),還有比如大規模插入時,立刻創建出一張臨時表,紀錄被放在臨時表中,臨時表表名被紀錄,讀取程序從執行完成的臨時表中讀取數據,讀完後刪除臨時表。

        這些方法的目的只有一個就是人爲的將鎖等級下降,讓那些不需要爲本次操作的紀錄可以順暢的讀取和更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章