我正在尝试获取MySQL数据库中两次更改内容的快照。我有许多不同实体的表,每个表都有一个“Last Updated”列,当一行更新时,该列自动设置为当前日期。
我有一个客户端应用程序,它使用多个SELECT语句(数据库中的每个表一个)查询数据库,对于任何具有以下行的行:“App的上一个同步时间”< =“Last Updated”< “当前系统时间”。这工作正常,并成功地使客户端应用程序与数据库保持同步。但是,有些表之间存在关系,我担心每个SELECT语句不会在数据库上同时运行,所以我可能最终得到这样的结果:
Client App | Server App
SELECT * FROM Table1 |
| Update Table1 & Table2, altering relationships
SELECT * FROM Table2 |
这样表(和关系)在拍摄快照的过程中被修改,可能会返回一些无效的关系信息(例如服务器应用程序将新行插入表1和2中,所以当客户端查询表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 :(得分:0)
您应该使用交易。不是在客户端应用上,而是在服务器应用上。
begin transaction
update table1 set ....
update table2 set ....
update table2 set ....
commit
这样,table1和table2同时提交,确保客户端应用程序的读取一致。
注意:您必须使用InnoDB引擎才能使交易工作