2013-09-05 77 views
2

我試圖獲取MySQL數據庫中兩次之間更改的快照。我有許多不同實體的表格,每個表格都有一個「Last Updated」列,當更新一行時,它自動設置爲當前日期。MySQL中的多個同時SELECT語句

我有一個查詢數據庫,使用多個SELECT語句(一個用於數據庫中的每個表),對此有任何行的客戶端應用程序:「應用程序的前同步時間」 < =「最近更新」 <「當前系統時間」。這工作正常,併成功保持客戶端應用程序與數據庫同步。然而,一些表有他們之間的關係,我很擔心,每個SELECT語句是不是在同一時間在數據庫上運行,所以我可能最終是這樣的:

Client App    |   Server App 
SELECT * FROM Table1 | 
         |  Update Table1 & Table2, altering relationships 
SELECT * FROM Table2 | 

使表(和關係)在獲取快照的中途被修改,可能返回一些無效的關係信息(例如,服務器應用程序向表中插入新行,所以當客戶端查詢表2時,有一行引用表1中的條目不存在)。

我想我需要使用交易或鎖定,但我不確定哪個或者是否有更好的方法。我使用MySQL Connector/.NET從C#訪問服務器。目前,我創建一個單一的MySqlCommand,用,例如,所有的SELECT語句:

string commandString = "SELECT * FROM Table1; SELECT * FROM Table2;"; 
using (MySqlCommand command = new MySqlCommand(commandString, connection)) 

然後閱讀它們:

using (MySqlDataReader reader = command.ExecuteReader()) 
{ 
    do 
    { 
     if (reader.HasRows) 
     { 
      //.... 
     }   
    } while (reader.NextResult()); 
} 

我怎麼會去阻止表的SELECT語句之間被修改?

+0

你試過LOCK和UNLOCK TABLES – SerenityNow

+0

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html – SerenityNow

+0

所以我會這樣做:LOCK TABLES Table1 READ,Table2 READ; SELECT * FROM Table1; SELECT * FROM Table2;解鎖表; ?這會阻止從其他連接寫入這些表?如果有人在鎖定時嘗試寫入,會發生什麼?它只是等待還是會導致錯誤? –

回答

0

您應該使用事務。不在客戶端應用上,而在服務器應用上。

begin transaction 
update table1 set .... 
update table2 set .... 
update table2 set .... 
commit 

這樣,table1和table2同時提交,確保在客戶端應用上一致的讀取。

注:必須使用InnoDB引擎的事務工作