我试图在MySQL数据库中获取两次更改之间的快照。我有许多不同实体的表,每个表都有一个“Last Updated”列,在更新行时自动设置为当前日期。
我有一个客户端应用程序,它使用多个SELECT语句(数据库中的每个表一个)查询数据库,用于任何行,这些行有:“app的上一次同步时间”

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语句之间修改表?

最佳答案

你应该使用事务处理。不是在客户端应用程序上,而是在服务器应用程序上。

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

这样,table1和table2同时提交,确保客户端应用程序上的一致读取。
注意:事务必须使用InnoDB引擎才能工作

10-04 23:19