2013-07-05 44 views
1

我需要運行多個會話來選擇MySQL中的行。在每個會話中,我首先選擇flag=0的行數。之後,我爲這些行設置了flag=1。 同時,我運行了另一個會話(或更多會話),它執行相同的操作。但是,我擔心在一次會議中的選擇可能會與其他會議發生衝突。 有什麼我可以做,以避免這種衝突?更新/選擇多個會話中的mysql表

我使用Python編程並使用Django框架。 Python或Django是否有類似「同步」的命令來確保這兩個會話不衝突?

+0

您可以使用[SELECT FOR UPDATE]鎖定您選擇的行(http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html) –

回答

0

這種多會話協調不是客戶端語言的一種功能;它是DBMS的一個功能。您選擇行FOR UPDATE,然後您更新它們並提交您的交易。

爲了使這個工作,你的表需要使用InnoDB(或XtraDB)引擎。 MyISAM無法做到。

你的操作會像這樣:

START TRANSACTION /* this may have its own function call */ 

SELECT id, whatever 
    FROM table 
    WHERE flag = 0 
    LIMIT 10 
    FOR UPDATE; 

/* do what you need to do with each row selected */ 

UPDATE table SET flag = 1 WHERE ID = ?id 

COMMIT; 

如果我這樣做,我會考慮用限位1,每次處理一行。但它應該適用於多行。

+0

謝謝您的回答!只是澄清。在「update table set flag = 1」之前,標誌仍爲0.如果我理解正確,「for update」將保留這些行,所以另一個「select」語句將不會選擇這些行。那是對的嗎?謝謝。 – fanchyna

+0

沒錯。希望這些行的select語句將會阻塞,直到您的事務提交或回滾。 –