c# - MySQL 中的多个同时 SELECT 语句

标签 c# mysql mysql-connector

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

我有一个查询数据库的客户端应用程序,使用多个 SELECT 语句(一个用于数据库中的每个表),对于具有以下内容的任何行:“App's Previous Sync Time”<=“Last Updated”<“Current System Time” ”。这工作正常,并成功地使客户端应用程序与数据库保持同步。但是,有些表之间存在关系,我担心每个 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 引擎才能使事务工作

关于c# - MySQL 中的多个同时 SELECT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18637407/

相关文章:

c# - Newtonsoft.Json 导致序列化发生两次导致 Reference.cs 中的重复定义

c# - 事件的嵌套触发

c# - 如何在 C# 中使用 select count() as ...

php - mysqlnd php_network_getaddresses : getaddrinfo failed: No such host is known

mysql - 升级到 MySQL 8。从服务器收到字段 '255' 的未知字符集索引。异常(exception)

c# - 如何获取控制台应用程序的屏幕大小?

Mysql 3天后自动删除事件

MySQL INT 含义

mysql - 由于时间戳原因,LOAD DATA FROM S3 命令失败

java - 没有找到适合 jdbc mysql 的驱动程序