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

原始应用具有以下特征:

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

这是我想知道的:

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

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

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

预先感谢您的帮助!

有帮助吗?

解决方案

  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/ususe-new-transactionscope-considecope-conside-harmful.aspx)如果您有多个DB操作需要共同管理一致性或仅在DB存储的Proc中处理它们。保持查询简单。请遵循以下技巧,了解锁定如何工作以及如何减少资源争夺和僵局: http://www.devx.com/gethelpon/10minutesloute/16488

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

其他提示

DBM通常使用锁来授予并发。锁是一种信号量的类型,将独家锁定授予某个资源并允许限制或排队的其他访问(仅在您使用不承认读取的情况下受到限制)。

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

DBMSS通常使用表锁(Myisam)或行锁(InnoDB,大多数其他DBMS)的概念。锁的类型确定锁的音量。桌子锁可能非常快,但通常被认为不如排级别锁。

行级锁发生在事务内(隐式或显式)。手动开始交易时,您将开始交易范围。在您手动关闭事务范围之前,您所做的所有更改都将归因于此确切的事务。您所做的更改也将服从 酸范式.

交易范围以及如何使用它是一个主题,对于这个平台而言,如果您愿意,我可以发布一些有关此主题的更多信息的链接。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top