Devart.Data.MySql:并发冲突:UpdateCommand 影响了预期的 1 条记录中的 0 条

Posted

技术标签:

【中文标题】Devart.Data.MySql:并发冲突:UpdateCommand 影响了预期的 1 条记录中的 0 条【英文标题】:Devart.Data.MySql: Concurrency violation: the UpdateCommand affected 0 of the expected 1 records 【发布时间】:2016-03-07 13:12:32 【问题描述】:

我使用 C# 和 Devart.Data.mysql 来更新数据库表中的行。但我有例外

并发冲突:UpdateCommand 影响了预期的 1 中的 0 记录

在尝试使用相同值更新行时。例如,我有两列 Id(主键)和 Title 的表数据。我在这张表中有一行 Id = 222, Title = 4444。然后我尝试用相同的值更新这一行:

using (var conn = new MySqlConnection(Cs))

    conn.Open();

    //update command
    var uc = new MySqlCommand(@"UPDATE data SET Title = @Title WHERE Id = @Id", conn);
    uc.Parameters.Add("@Title", MySqlType.VarChar, 50, "Title");
    uc.Parameters.Add("@Id", MySqlType.VarChar, 50, "Id");

    //create adapter
    var adapter = new MySqlDataAdapter("", conn)
    
        UpdateBatchSize = 100,
        UpdateCommand = uc
    ;
    adapter.TableMappings.Add("Table", "data");

    //create table
    var table = new DataTable("data");
    DataColumn col = table.Columns.Add("Id", typeof(string));
    col.Unique = true;
    table.PrimaryKey = new[]  col ;
    table.Columns.Add("Title", typeof(string));

    //create dataset
    var ds = new DataSet();
    ds.Tables.Add(table);

    DataRow row = table.NewRow();
    row["Id"] = "222";
    row["Title"] = "4444";
    table.Rows.Add(row);
    row.AcceptChanges();
    row.SetModified();

    adapter.Update(ds);

在那之后,我在这里遇到了关于并发冲突的异常。如果我为 Title 使用另一个值,它可以正常工作。看起来没有一些时间戳或修改值我无法使用相同的值执行更新命令。为什么?

【问题讨论】:

【参考方案1】:

看起来这种行为是设计使然,可以通过提供以下选项来更改连接字符串:

Found Rows=true;

此选项是在版本 7.0.25 中引入的,如 here 所示。

【讨论】:

以上是关于Devart.Data.MySql:并发冲突:UpdateCommand 影响了预期的 1 条记录中的 0 条的主要内容,如果未能解决你的问题,请参考以下文章

JMeter之Ramp-up Period(in seconds)说明(可同时并发)

JMeter之Ramp-up Period(in seconds)说明(可同时并发)

微服务注册中心的注册表如何更好的防止读写并发冲突

微服务注册中心的注册表如何更好的防止读写并发冲突

Elasticsearch Elasticsearch并发冲突问题

gradle测试任务相互冲突