MySQL中同时存在多个SELECT语句

本文关键字:SELECT 语句 存在 MySQL | 更新日期: 2023-09-27 18:30:13

我正在尝试获取MySQL数据库中两次更改的快照。我有许多不同实体的表,每个表都有一个"上次更新"列,当一行更新时,该列会自动设置为当前日期。

我有一个客户端应用程序,它使用多个SELECT语句(数据库中的每个表都有一个SELECT语句)查询数据库,以查找具有以下内容的任何行:"应用程序的上一次同步时间"<="上次更新"<"当前系统时间"。这运行良好,并成功地使客户端应用程序与数据库保持同步。然而,有些表之间有关系,我担心每个SELECT语句不会在数据库上同时运行,所以我可能会得到这样的结果:

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

因此,表(和关系)在拍摄快照的中途被修改,可能会返回一些无效的关系信息(例如,服务器应用程序将新行插入表1&2中,因此当客户端查询表2时,有一行引用了表1中不存在的项)。

我想我需要使用事务或锁定,但我不确定哪种方法或是否有更好的方法。我使用MySQL连接器/.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语句之间修改表?

MySQL中同时存在多个SELECT语句

您应该使用transaction。不是在客户端应用程序上,而是在服务器应用程序上。

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

通过这种方式,表1和表2同时提交,确保客户端应用程序上的读取一致。

注意:您必须使用InnoDB引擎进行事务处理才能工作