繁体   English   中英

MySQL中的多个同时SELECT语句

[英]Multiple simultaneous SELECT statements in MySQL

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

我有一个客户端应用程序,该客户端应用程序使用多个SELECT语句(数据库中的每个表一个)查询数据库,查询是否具有以下任何行:“应用程序的上次同步时间” <=“上次更新时间” <“当前系统时间”。 这可以正常工作,并且可以成功地使客户端应用程序与数据库同步。 但是,有些表之间存在关系,并且我担心每个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语句之间修改表?

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

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

这样,table1和table2会同时提交,以确保在客户端应用程序上的读取一致。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM