关于c#:在数据库访问应用程序中管理并发的最佳方法是什么?

What's the best way to manage concurrency in a database access application?

前一段时间,我编写了一个应用程序,供多个用户使用以处理交易创建。
我已经有一段时间没有做开发了,而且我不记得我是如何管理用户之间的并发性的。因此,我正在寻求有关设计的建议。

原始应用程序具有以下特征:

  • 每个用户一个沉重的客户。
  • 单个数据库。
  • 访问每个用户的数据库以插入/更新/删除交易。
  • 应用程序中的一个网格,反映了交易表。每当有人更改交易时,该网格都会更新。
  • 我正在使用WPF。

这就是我想知道的:

  • 我是否正确地认为我不应该关心每个应用程序与数据库的连接?考虑到每个节点都有一个单例,我希望每个客户端只有一个连接没有问题。

  • 如何防止访问的并发?我猜我在修改数据时应该锁定,但是不记得要怎么做。

  • 如何将网格设置为每当我的数据库被更新(例如,由另一个用户更新)时自动更新?

  • 在此先感谢您的帮助!


  • 考虑利用连接池来减少连接数。请参阅:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

  • 尽可能晚地锁定并尽快释放以最大程度地提高并发性。您可以使用TransactionScope(请参阅:http://msdn.microsoft.com/zh-cn/library/system.transactions.transactionscope.aspx和http://blogs.msdn.com/b/dbrowne/archive/2010/05 /21/using-new-transactionscope-considered-harmful.aspx),如果您有多个数据库操作需要一起管理一致性或仅在数据库存储的proc中处理它们。保持查询简单。请遵循以下提示以了解锁定如何工作以及如何减少资源争用和死锁:http://www.devx.com/gethelpon/10MinuteSolution/16488

  • 我不确定其他数据库,但是对于SQL,您可以使用SQL依赖关系,请参见http://msdn.microsoft.com/zh-cn/library/a52dhwx7(v = vs.80).aspx


  • 并发通常由DBMS使用锁来授予。锁是一种信号量,可以将排他锁授予某个资源,并允许其他访问被限制或排队(仅在使用未提交的读取的情况下才受限制)。

    当您未达到可能会触及DBMS的max_connections设置的高度时,连接数本身并不构成问题。否则,出于维护目的或关闭它而连接到它可能会遇到问题。

    DBMS通常使用表锁(MyISAM)或行锁(InnoDB,大多数其他DBMS)的概念。锁的类型决定了锁的音量。表锁可以非常快,但通常不如行级锁。

    行级别锁定发生在事务(隐式或显式)内部。手动启动事务时,您将开始事务范围。在您手动关闭事务范围之前,您所做的所有更改都将属于此确切事务的属性。您所做的更改也将遵循ACID范式。

    事务作用域及其使用方法对于该平台来说是一个太长的主题,如果您愿意,我可以发布一些链接,其中包含有关此主题的更多信息。

    对于自动更新,大多数数据库都支持某种触发机制,该机制是在数据库上的特定操作(例如,创建新记录或更改记录)上运行的代码。您可以将代码发布到此触发器中。但是,即使该语言可能,您也应该仅将更改的信息告知接收方应用程序,而不是从触发器中真正"做"这些更改。请记住,触发代码的操作将被挂起,直到您完成触发代码为止。这意味着如果完全需要精益触发器,那么它是最好的。