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范式。
事务作用域及其使用方法对于该平台来说是一个太长的主题,如果您愿意,我可以发布一些链接,其中包含有关此主题的更多信息。
对于自动更新,大多数数据库都支持某种触发机制,该机制是在数据库上的特定操作(例如,创建新记录或更改记录)上运行的代码。您可以将代码发布到此触发器中。但是,即使该语言可能,您也应该仅将更改的信息告知接收方应用程序,而不是从触发器中真正"做"这些更改。请记住,触发代码的操作将被挂起,直到您完成触发代码为止。这意味着如果完全需要精益触发器,那么它是最好的。