具有多个线程的last_insert_id

本文关键字:last insert id 线程 | 更新日期: 2023-09-27 18:24:45

我正在用C#编写一个应用程序,它基本上由两个线程组成。线程1获取数据并将其放入数据库,线程2获取该数据并执行一些附加操作。我会遇到last_insert_id的问题吗,比如从第二个线程中完成的插入中获得第一个线程中的插入id?我使用连接器.net,主要使用MySqlHelper和连接字符串作为参数。

在这种情况下使用last_insert_id安全吗?还是我最好重新思考我的方法,比如为这些任务创建两个单独的应用程序?

此外,我不能在一个线程中完成所有事情。每个线程都会定期运行,并且需要不同的数量才能完成。第一个线程必须能够插入数据,而第二个线程执行其操作。

具有多个线程的last_insert_id

last_insert_id()在PER CONNECTION基础上是可靠的。如果你的线程共享同一个MySQL连接并进行插入,那么你将要检索的ID还没有定义。

如果你没有运行太多的线程,最好让各个线程打开自己的MySQL连接,然后你就可以毫无问题地使用last_insert_id()了。

您将通过以下提及的方式编写代码来获得真正的结果。。。

示例C#代码

using (SqlConnection con = new SqlConnection("Your Connection String"))
{
    using (SqlCommand cmd = new SqlCommand("Your Stored Procedure Name", con))
    {
        SqlParameter param = new SqlParameter();
        param.ParameterName = "Parameter Name";
        param.Value = "Value";
        param.SqlDbType = SqlDbType.VarChar;
        param.Direction = ParameterDirection.Input;
        cmd.Parameters.Add(param);
        using (IDataReader DR = cmd.ExecuteReader())
        {
            if (DR.Read())
            {
            }
        }
    }
}

示例存储过程

创建过程ABC作为

SET NOCOUNT ON
SET XACT_ABORT ON
Begin Try
    Begin Tran
        //Insert Statement
        Select Scope_Identity()
    End Tran
End Try
Begin Catch
    Rollback Tran
End Catch