12

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

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

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

这就是我想知道的:

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

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

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

预先感谢您的帮助!

4

2 回答 2

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

  2. 尽可能晚地锁定并尽快释放以最大化并发性。您可以使用 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. I am not sure other db, but for SQL, you can use SQL Dependency, see http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx

于 2011-01-13T15:34:50.193 回答
3

并发通常由 DBMS 使用锁授予。锁是一种信号量,它授予特定资源排他锁并允许其他访问受到限制或排队(仅在您使用未提交读取的情况下受到限制)。

当您没有达到可能触及 DBMS 的 max_connections 设置的高度时,连接数本身不会造成问题。否则,出于维护目的或将其关闭,您可能会遇到连接问题。

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

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

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

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

于 2011-01-13T15:27:28.393 回答