【问题标题】:how to handle db concurrency in client-server application in C#?如何在 C# 中处理客户端-服务器应用程序中的数据库并发?
【发布时间】:2011-02-06 13:02:28
【问题描述】:
  1. 我正在使用 C# WPF 开发一个应用程序,该应用程序将具有客户端-服务器架构(客户端将执行产品销售计费)。我是这个领域的新手,我问了这个问题来开始我的开发过程。 Click here to view question.

    所以,最终我选择了 MySQl、WCf 和 WPF。现在我有一个愚蠢的问题。我是否需要在我的应用程序中显式处理 DB 并发(例如 3 个客户端同时插入数据),否则 MySQl 会在没有任何冲突的情况下处理这个问题?
  2. 为了完成我的项目,我将在 WCf 中创建一个服务,该服务将从客户端应用程序执行数据库查询。您对提高我的应用程序性能有什么建议吗?

【问题讨论】:

    标签: c# mysql wpf


    【解决方案1】:

    关于您关于并发的问题,您的应用程序应设计为尽可能短地保持与数据库的连接打开。对数据库的每个操作都应该涉及:打开连接,对数据库进行操作,关闭连接而不是:打开连接,做一堆可能与获取/更新/插入数据相关的工作,然后在“结束” " 关闭连接。

    现在,关于应用程序并发性,您最终会遇到两种情况。在场景一中,我称之为“最后一次写入获胜”,最后写入给定行的任何连接都是所存储数据的版本。如果 Alice 然后 Bob 同时写入同一行的 Name 列,则存储 Bob 的版本。这是迄今为止最简单的方法,但如果您可能有很多人更新相同的数据,则可能会出现问题。

    另一种方法是“先写获胜”,也称为乐观并发。在这种情况下,第二个调用检查数据自上次检索后是否未更改,如果已更改,则回滚其事务。接下来会发生什么取决于您的应用程序。一些系统只是简单地抛出一个错误并要求用户重新输入他们的信息(放弃他们原来的改变)。这显然更容易实现。一些应用程序告诉用户数据已更改,并提供一些有关不同之处的信息,并询问他们是否要覆盖此更改。这可能会更复杂,具体取决于您的系统架构。

    请参阅Optimistic Concurrency 了解更多信息。

    【讨论】:

      【解决方案2】:
      1. 数据库服务器非常擅长处理多个更新。
      2. 使用netTcpBinding

      【讨论】:

      • @Darin:1. 是一个非常宽泛的声明,并没有考虑到特定的应用程序需求。你有 2. 的理由吗?
      • @Eric J.,问题中没有表达具体的应用需求。 OP 询问 MySQL 是否会处理 3 个并发插入,答案是肯定的。至于第2点:netfxharmonics.com/2006/01/WCF-Relative-Binding-Speeds.aspx
      • 如果用户 A 打开一个表单来编辑数据,而用户 B 更改了用户 A 已打开进行编辑的数据,那么用户 A 会保存他的更改......会发生什么?这就是OP所要求的。您是否通知用户 A 已进行更改?您是否锁定该数据以进行更改,以便用户 B 一开始就无法打开它进行更改?
      【解决方案3】:

      处理并发的方法有很多种,各有优缺点。

      This article 给出了很好的一般性介绍。

      如果您想分享更多关于并发方面的要求:

      • 您希望什么时候发生 多人尝试编辑相同的 数据?
      • 您希望用户多久编辑一次相同的数据?

      我很乐意提供更具体的建议。

      【讨论】:

        猜你喜欢
        • 2011-07-10
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多