我有一個InnoDB表,需要每10分鐘內從60k到200k記錄中的任何地方重新填充。我們的方法到現在爲止一直如下:MySQL:在事務中截斷表?
- 關閉自動提交
- 截斷表
- 執行SELECT查詢&額外的計算(使用PHP)
- 插入新記錄
- 提交
雖然通過截斷操作執行後,數據立即刪除,並且沒有lon ger可從用戶界面獲得。對我們的用戶來說,這非常令人不安,即使在大約30秒左右的時間內,腳本遇到提交操作並且表被重新填充。
我想也許我可以在整個交易中將整個操作包括在內,包括 Truncate,並且這可能會減少表格在用戶期間顯示爲空的時間長度。所以我將「SET AUTOCOMMIT = 0」改爲「START TRANSCATION」。
哎呀!這與期望的效果相反!現在TRUNCATE操作仍然發生在腳本的開頭,但是在事務內部實際執行INSERT操作需要很長時間,因此在執行COMMIT操作並且表中的數據再次可用時,已經差不多十分鐘!
什麼可能導致此?實際上,我根本沒有期望有任何改變,因爲我的印象是,啓動交易基本上只會關閉Autocommit?
這是一個非常有趣的想法。我最初的直覺反應是表面感覺有點ha but,但實際上它們有一定的優雅簡單性,它可以完美地解決我的問題。希望我自己想到了。 :) – 2011-05-13 01:32:39
已經過去將近一年了,只是想跟進並提到這就是我們最終做的事情,它就像一個魅力。我們創建新表格,插入一大堆記錄,並在更新完成後立即將它們交換出去 - 最終用戶即時顯示。再次感謝。 – 2012-02-22 00:13:59
謝謝你。一直在用最好的方式來進行批量數據更新,而不需要將數據庫關閉幾秒鐘。這是一個很好的解決方法。 – NickH 2013-06-29 18:47:22