我試圖獲取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語句之間被修改?
你試過LOCK和UNLOCK TABLES – SerenityNow
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html – SerenityNow
所以我會這樣做:LOCK TABLES Table1 READ,Table2 READ; SELECT * FROM Table1; SELECT * FROM Table2;解鎖表; ?這會阻止從其他連接寫入這些表?如果有人在鎖定時嘗試寫入,會發生什麼?它只是等待還是會導致錯誤? –