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

时间:2011-01-13 14:43:51

标签: c# database concurrency database-concurrency

不久前,我写了一个由多个用户用来处理交易创建的应用程序。 我现在还没有完成开发一段时间,我不记得我是如何管理用户之间的并发性的。因此,我在设计方面寻求一些建议。

原始申请具有以下特征:

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

这就是我想知道的:

  1. 我认为我不应该关心每个应用程序与数据库的连接吗?考虑到每个单独存在一个单例,我希望每个客户端有一个连接没有问题。

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

  3. 如何设置网格,以便在我的数据库更新时自动更新(例如,由其他用户更新)?

  4. 提前感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

并发通常由DBMS使用锁授予。锁是一种信号量,它授予对某个资源的独占锁,并允许限制或排队其他访问(仅限于使用未经读取的读取的情况)。

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

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

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

交易范围以及如何使用它对于这个平台来说是一个太长的话题,如果你愿意,我可以发布一些链接来提供关于这个主题的更多信息。

对于自动更新,大多数数据库都支持某种触发机制,即在数据库上的特定操作上运行的代码(例如,创建新记录或更改记录)。您可以在此触发器中发布您的代码。但是,您应该只通知接收应用程序的更改,而不是真正从触发器“执行”更改,即使语言可能使其成为可能。请记住,触发代码的操作将暂停,直到您完成触发器代码。这意味着如果需要,精益触发最好。

答案 1 :(得分:2)

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

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

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