如何解决.NET中数据表的并发冲突?

如何解决.NET中数据表的并发冲突?,.net,database,concurrency,.net,Database,Concurrency,我在VB.NET2.0中使用DataTables,我正在编写代码来处理多用户环境中可能出现的并发冲突。我知道如何捕获并发冲突,但不知道如何在使用DbCommandBuilder生成的INSERT、UPDATE和DELETE命令时解决这些冲突 在我看来,并发冲突发生在五种不同的情况下: 当 正在更新数据库中已同时更新的行 更新已从数据库中同时删除的行 删除数据库中已同时更新的行 删除已从数据库中同时删除的行 插入主键已同时插入数据库的行 我知道如何解决情况1;我发现了几个如何使用DataTable

我在VB.NET2.0中使用DataTables,我正在编写代码来处理多用户环境中可能出现的并发冲突。我知道如何捕获并发冲突,但不知道如何在使用DbCommandBuilder生成的INSERT、UPDATE和DELETE命令时解决这些冲突

在我看来,并发冲突发生在五种不同的情况下:

  • 正在更新数据库中已同时更新的行
  • 更新已从数据库中同时删除的行
  • 删除数据库中已同时更新的行
  • 删除已从数据库中同时删除的行
  • 插入主键已同时插入数据库的行
  • 我知道如何解决情况1;我发现了几个如何使用DataTable.Merge方法同步更新行的示例。然而,合并似乎不适用于其他4种情况

    例如,假设我正在尝试更新一个同时从数据库中删除的行(情况2),并且我的业务规则告诉我使用更新的列值将该行恢复到数据库中。我不知道如何更改DataRow属性,以便Adapter.Update方法根据需要将该行插入数据库;合并不起作用

    考虑到Merge处理情况1的便利性,我确信对于其他并发冲突也必须有简单的解决方案,我只是忽略了它们。有人能给我一个正确的方向吗


    -TC

    如果您尝试更新的行被另一个进程删除,并且您需要恢复它,那么您需要捕获在尝试更新时发生的并发异常,并通过将该行插入数据库进行响应:

  • 保存更新的值
  • 将并发冲突合并到表中,这将删除数据库中已删除的行
  • 使用保存的值在表中插入新行
  • 保存表格

  • 如果您尝试更新的行已被另一个进程删除,并且您需要恢复该行,那么您需要捕获在尝试更新时发生的并发异常,并通过将该行插入数据库进行响应:

  • 保存更新的值
  • 将并发冲突合并到表中,这将删除数据库中已删除的行
  • 使用保存的值在表中插入新行
  • 保存表格

  • 大卫,谢谢你的回复。不幸的是,我发现第二步并不像你描述的那样有效。当我将并发冲突合并到我的表中时,从数据库中删除的行不会从DataTable中删除。此外,您提到,这应该是为了响应并发异常而执行的。但是,我发现并发异常一次只针对一个冲突引发,而合并必须一次对整个表进行。因此,在引发异常时处理违规会导致第二次或第三次违规被错误处理。因此,我得出结论,不能依靠并发异常来启动响应,我必须先发制人地查找违规行为。我弄错了吗?大卫,谢谢你的回答。不幸的是,我发现第二步并不像你描述的那样有效。当我将并发冲突合并到我的表中时,从数据库中删除的行不会从DataTable中删除。此外,您提到,这应该是为了响应并发异常而执行的。但是,我发现并发异常一次只针对一个冲突引发,而合并必须一次对整个表进行。因此,在引发异常时处理违规会导致第二次或第三次违规被错误处理。因此,我得出结论,不能依靠并发异常来启动响应,我必须先发制人地查找违规行为。我弄错了吗?