簡體   English   中英

具有多個線程的last_insert_id

[英]last_insert_id with multiple threads

我正在用C#編寫一個基本上由兩個線程組成的應用程序。 線程1獲取數據並將其放入數據庫,線程2獲取該數據執行一些附加操作。 我是否會遇到last_insert_id的問題,例如從第二個線程中完成的插入中獲取第一個線程中的插入ID? 我正在使用連接器.net,主要使用MySqlHelper和連接字符串作為參數。

在這種情況下,last_insert_id是否可以安全使用?還是最好重新考慮自己的方法,例如為任務創建兩個單獨的應用程序?

另外,我無法在一個線程中完成所有操作。 每個線程定期運行,並且花費不同的時間來完成。 第一個線程必須能夠在第二個線程執行其操作時插入數據。

基於每個連接,last_insert_id()是可靠的。 如果您的線程共享相同的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())
            {
            }
        }
    }
}

樣品儲存程序

創建Proc ABC AS

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM