C# MySQL中的多个并发SELECT语句
我试图获取MySQL数据库中两次更改的快照。我有许多不同实体的表,每个表都有一个“Last Updated”列,当一行被更新时,该列会自动设置为当前日期C# MySQL中的多个并发SELECT语句,c#,mysql,mysql-connector,C#,Mysql,Mysql Connector,我试图获取MySQL数据库中两次更改的快照。我有许多不同实体的表,每个表都有一个“Last Updated”列,当一行被更新时,该列会自动设置为当前日期 我有一个客户端应用程序,它使用多个SELECT语句(数据库中每个表一个语句)查询数据库,查询任何有“应用程序的上一个同步时间”的行,您应该使用事务。不是在客户端应用程序上,而是在服务器应用程序上 begin transaction update table1 set .... update table2 set .... update tabl
我有一个客户端应用程序,它使用多个SELECT语句(数据库中每个表一个语句)查询数据库,查询任何有“应用程序的上一个同步时间”的行,您应该使用事务。不是在客户端应用程序上,而是在服务器应用程序上
begin transaction
update table1 set ....
update table2 set ....
update table2 set ....
commit
通过这种方式,table1和table2可以同时提交,确保客户端应用程序上的一致读取
注意:您必须使用InnoDB引擎才能使事务正常工作您是否尝试过锁定和解锁表?因此,我将执行如下操作:锁定表表表1读取,表2读取;从表1中选择*;从表2中选择*;解锁表格?这会阻止其他连接写入这些表吗?如果有人试图在锁着的时候写东西会怎么样?它只是等待还是导致错误?它将生成锁定错误。您可能希望首先在测试环境中执行此操作,然后在进行实时备份之前进行备份。无论您做什么,1)首先备份2)测试环境(如果可能)。表锁仅能防止其他会话进行不适当的读取或写入。持有锁(甚至是读锁)的会话可以执行表级操作,如DROP table。截断操作不是事务安全的,因此如果会话在活动事务期间或持有表锁时尝试截断操作,则会发生错误。
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());
}
begin transaction
update table1 set ....
update table2 set ....
update table2 set ....
commit