溫馨提示×

C# ADO.NET中如何處理并發沖突

c#
小樊
116
2024-06-25 09:14:37
欄目: 編程語言

在C# ADO.NET中處理并發沖突通常有兩種方式:

  1. 使用樂觀并發控制:在進行數據更新之前,先查詢數據的當前版本號或時間戳,并在更新數據時檢查這個版本號或時間戳是否和數據庫中的一致。如果一致,則更新數據,如果不一致,則認為發生了并發沖突。在ADO.NET中可以使用CommandBuilder對象生成Update語句時指定參數檢查并發沖突。
string updateCommand = "UPDATE Table SET Column = @value WHERE ID = @id AND Version = @version";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    SqlCommand command = new SqlCommand(updateCommand, connection);
    command.Parameters.AddWithValue("@value", updatedValue);
    command.Parameters.AddWithValue("@id", id);
    command.Parameters.AddWithValue("@version", currentVersion);

    int rowsAffected = command.ExecuteNonQuery();

    if (rowsAffected == 0)
    {
        // 處理并發沖突
    }
}
  1. 使用悲觀并發控制:在進行數據更新之前,先鎖定數據,確保只有一個線程可以修改數據。在ADO.NET中可以使用事務來實現悲觀并發控制。
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    
    SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.Serializable);

    try
    {
        SqlCommand command = connection.CreateCommand();
        command.Transaction = transaction;

        command.CommandText = "SELECT * FROM Table WITH (UPDLOCK) WHERE ID = @id";
        command.Parameters.AddWithValue("@id", id);

        SqlDataReader reader = command.ExecuteReader();

        if (reader.Read())
        {
            // 更新數據
        }

        reader.Close();

        transaction.Commit();
    }
    catch (Exception ex)
    {
        transaction.Rollback();
        // 處理異常
    }
}

以上是兩種常見的處理并發沖突的方式,開發者可以根據具體情況選擇合適的方式來處理數據更新時可能發生的并發沖突。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女