2011-10-21 67 views
0

這是一個兩部分問題。當我在表上執行SELECT時,是在SELECT正在運行時將該表從任何用途上鎖定?我在桌子上執行SELECT時鎖定桌子嗎?

如果是這樣,在執行SELECT語句時不鎖定表的方法是什麼?我正在使用MySQL 4.1.20 MyISAM。

更新這裏有一個類似的問題Any way to select without causing locking in MySQL?但答案不會的MyISAM

+3

輕微的切線,但爲什麼你仍然在4.1? –

+1

這是在這裏得到解答之前: [MySQL的NOLOCK quivelant] [1] [1]:http://stackoverflow.com/questions/917640/any-way-to-select-without-causing-locking- in-mysql – Jacque

+1

鎖是邪惡的,通常完全沒有必要。 –

回答

-1

想一想:當你做你的選擇時,你是否改變任何表格單元格?如果沒有,則不需要鎖定表,MySQL不需要。表鎖定必須在UPDATE時發生,而不是在SELECT時間。

+0

MyISAM在執行選擇時在表上放置表級讀取鎖,InnoDB應用更多粒度鎖定。但重點是,即使選擇適用於鎖定,但對於某些存儲引擎而言,它依賴於隔離級別。 (和其他數據庫走不同的路線,並使用MVCC進一步避免鎖定) – nos

2

是的,使用MyISAM表格,選擇鎖定表格以進行插入/更新。然而,幾個選擇可以同時運行(即它應用讀取鎖定)。如果表格中間沒有可用空間,插入會將數據添加到(內部)存儲的末尾,而這些插入仍然可以與選擇同時運行。

更多信息here。請注意,MyISAM和InnoDB在這方面的工作方式非常不同。

+0

什麼是防止鎖定的方法?我如何做一個髒讀? –

+0

@ dev.e.loper您切換到innodb並將隔離級別設置爲「未讀取未讀」。 – nos