在C# ADO.NET中处理并发冲突通常有两种方式:
- 使用乐观并发控制:在进行数据更新之前,先查询数据的当前版本号或时间戳,并在更新数据时检查这个版本号或时间戳是否和数据库中的一致。如果一致,则更新数据,如果不一致,则认为发生了并发冲突。在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) { // 处理并发冲突 } }
- 使用悲观并发控制:在进行数据更新之前,先锁定数据,确保只有一个线程可以修改数据。在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(); // 处理异常 } }
以上是两种常见的处理并发冲突的方式,开发者可以根据具体情况选择合适的方式来处理数据更新时可能发生的并发冲突。