2013-07-08 42 views
0

說,當單獨或完全鎖定在表中的行,我們有一個叫做人的表像下面無論UPDATE語句中使用InnoDB的

CREATE TABLE person (
    id INT, 
    name VARCHAR(30), 
    point INT 
); 

我想更新整個表的變化,根據一個人的地步其他的像

UPDATE person SET point=(
    SELECT point FROM person WHERE some-condition 
); 

,或者只是簡單地由一個增加,像

UPDATE person SET point=point+1; 

當執行上面的腳本時,哪些行將被鎖定將其他語句等到更新語句結束或可以在兩個更新操作之間執行

+0

只有當您提供您正在使用的事務隔離級別時,才能解答您的問題。 –

+0

[This answer](http://stackoverflow.com/a/17060396/797303)可能有幫助 –

回答

1

您的更新語句都沒有where子句。 (你的第一個選擇帶有where子句;可能你希望where子句是更新的一部分,但我不確定這一點。)

這意味着他們將更新您的所有行person表。 InnoDB提供的交易語義表示每一行都將被鎖定,直到整個更新完成。也就是說,其他更新將被阻止。如果您嘗試其他更新的順序與此查詢中的更新順序不同,則可能導致死鎖。

其他客戶端連接select-queries將會看到表格的前一個狀態...更新語句開始之前的狀態...直到更新語句完成。在很多情況下,InnoDB可以做到這一點,而不會延遲對其他連接查詢的響應。但有時它必須延遲其反應。當InnoDB提交結果時,最新的延遲可能會在更新查詢結束時發生。

記住這一點:爲了實現事務語義,InnoDB犧牲了查詢性能的可預測性。

我強烈建議你避免在沒有where子句的情況下進行更新,這樣做有意義。它不會在你的第二個(給每個人另一個點)查詢。