作者 主題: 問一個非常菜鳥的觀念:關於資料庫鎖定  (閱讀 4954 次)

0 會員 與 1 訪客 正在閱讀本文。

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體

現在遇到一個狀況是, 因為程式必須跑 crontab 排程來讀 mysql 資料, 所以這支程式是每天讀取一次後, 需要跑幾百萬次迴圈處理資料到結束
因為之前接觸的都是很小的案子或自己的作品, 沒什麼機會處理較多筆的資料, 小的資料處理單筆讀寫速度很快, 沒有什麼資料庫鎖定的問題

假設:
資料表A:三百萬筆資料
狀況 1:一次讀取三百萬筆到陣列中並跑三百萬次迴圈處理資料到結束
狀況 2:在讀取資料表的同時仍有新的資料 Insert 到資料表A 中

像這種情形資料表會自動鎖定嗎?因為讀三百萬筆資料需一段時間
如這篇文章所指的隱性鎖定
http://forum.slime.com.tw/thread222087.html
如果是的話,執行讀取時,是否就無法INSERT資料了?

因為資料很大, 想釐清一些觀念再想比較適當的解決方式~~

先謝謝前輩們幫我解決^^
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
1) 三百萬筆很大耶,如果一筆有 100 byte, 讀進來光資料就 300MB. 2) 你可以一次只讀一些進來,處理完再讀一些來處理, 這樣就不會影響別的程式 insert. 3) 我還是覺得你要確定一下是否有別的較好的作法,比如直接用 sql 指令做而不是全部都讀進程式處理.

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
利用 mysql replaction 的方式來處理...
你可以有另外一台 mysql 專門來負責處理被跑各種報表....

希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

liteC

  • 憂鬱的高中生
  • ***
  • 文章數: 158
    • 檢視個人資料
    • 軟體
嗯 因為是用戶動作的log 所以資料很大
必須整合有用資料到小資料表

謝謝前輩們的建議!
非常謝謝學長們熱心回答我發問的問題
非常感寫 m(_ _)m

wenlien

  • 憂鬱的高中生
  • ***
  • 文章數: 119
  • 性別: 男
    • 檢視個人資料
    • Open or not open, that is the stupid question.

現在遇到一個狀況是, 因為程式必須跑 crontab 排程來讀 mysql 資料, 所以這支程式是每天讀取一次後, 需要跑幾百萬次迴圈處理資料到結束
因為之前接觸的都是很小的案子或自己的作品, 沒什麼機會處理較多筆的資料, 小的資料處理單筆讀寫速度很快, 沒有什麼資料庫鎖定的問題

假設:
資料表A:三百萬筆資料
狀況 1:一次讀取三百萬筆到陣列中並跑三百萬次迴圈處理資料到結束
狀況 2:在讀取資料表的同時仍有新的資料 Insert 到資料表A 中

像這種情形資料表會自動鎖定嗎?因為讀三百萬筆資料需一段時間
如這篇文章所指的隱性鎖定
http://forum.slime.com.tw/thread222087.html
如果是的話,執行讀取時,是否就無法INSERT資料了?

因為資料很大, 想釐清一些觀念再想比較適當的解決方式~~

先謝謝前輩們幫我解決^^

lock 有兩種, table lock, row lock.
所以要看你是用哪種資料庫.
一般情況下, select table時, 還是可以insert table.
除非你下select table for read/write.
細節請參閱官網文件資料.

regards,

Stanley Huang
regards,

Stanley Huang

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
不過在 MySQL 上...
若是表格使用的存儲引擎為 myisam 的話, 不管怎樣都是 table lock 喔.. :) ..
要用 row lock 則得用 innodb 才行唷...

這也要看樓主用的是什麼囉...
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/