如何管理多连接的主键?

tjjdgumg  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(267)

假设我有一个应用程序,它从一个internet站点提取一些数据并将它们添加到数据库中。此应用程序在多个示例中运行,每个示例提取特定国家的数据。
有些数据链接到名为 rounds 其中有 PKauto-increment 菲尔德,我的疑问来自于这个密码:

using (MySqlConnection connection = new DBConnection().Connect())
{
    using (MySqlCommand command = new MySqlCommand())
    {
        command.Connection = connection;
        command.CommandText = "INSERT IGNORE INTO competition_rounds (round_id, season_id, `name`) 
                                             VALUES (@round_id, @season_id, @round_name)";

        command.Parameters.Add("@round_id", MySqlDbType.Int32).Value = round.Id;
        command.Parameters.Add("@season_id", MySqlDbType.Int32).Value = round.seasonId;
        command.Parameters.Add("@round_name", MySqlDbType.VarChar).Value = round.Name;
        command.ExecuteNonQuery();

        return Convert.ToInt32(command.LastInsertedId);
    }
}

上面的代码为 rounds table,这个很好用。但是,如果我有多个示例在运行,那么应用程序是否可能触发相同的代码(在两个示例中)并为两个示例返回相同的id?如:

instance 1 -> fire round insert -> return 3
instance 2 -> fire round insert -> return 3

两个示例在完全相同的时间内执行了相同的方法。这种情况会发生吗?有可能阻止吗?我应该创建一个guid还是一个composed PK ?

rkue9o1l

rkue9o1l1#

客户端加载 LastInsertedId 来自ok\u数据包的属性:
从服务器向客户机发送一个ok数据包,表示命令成功完成。从mysql 5.7.5开始,ok数据包也被用来表示eof,而eof数据包被弃用。
在服务器端,根据文档:
您可以使用last \u insert \u id()sql函数或mysql \u insert \u id()c api函数检索最近自动生成的自动增量值。这些函数是特定于连接的,因此它们的返回值不受另一个执行插入的连接的影响。
换言之,这种情况(在任何值得尊敬的数据库系统中)都是可以解释的。
你会没事的。

quhf5bfb

quhf5bfb2#

像mysql这样的数据库管理系统(dbms)基于acid(原子性、一致性、隔离性、持久性)事务进行操作。这些事务是按顺序的“全部”或“无”方式安排的。因此,您不需要担心并行事务。
这就是说,对于多个应用程序示例,您可能需要担心哪个事务是首先处理的。也就是说,应用程序instancea的usera可以发送insert a,而应用程序instanceb的userb可以在usera之后的某个时间发送insert b。即使usera先发送请求,它们也可以在b中接收并处理,然后是一个订单——可能是由于网络延迟。

相关问题