2012-08-04 224 views
0

我想知道如何在数据库驱动的应用程序中实现锁定(以c#为例,我指的是桌面应用程序或Web应用程序都连接到处理数据库的WCF/Web服务操作)。数据库锁定

我从这篇wiki文章http://en.wikipedia.org/wiki/Lock_(computer_science了解到我可以做乐观锁定,即检查自上次读取以来是否进行了更新,并相应地抛出错误并要求用户重新读取数据并尝试再次更新。但是如果有更多的用户同时进行更新,缺点是可能会有很多更新试用和错误。

作为一个结论,我认为乐观锁定是一种选择。 是否有其他的选项并不复杂? 我认为锁定和互斥是一种选择,但我想不出一种方法来实现“如果”条件,以查看哪些记录被阻止,使得它不会导致死锁。

回答

0

一种简单的方式来锁定数据可以创建数据库的一个简单的表样柱:

列1:表名 列2:行ID 列3:锁定(布尔) 毕竟您的软件可以读取此表以了解哪个记录正在修改中。

0

避免死锁是关于以正确的顺序获取锁。例如,在修改某个特定用户的数据之前,您可以UPDLOCK该用户,以便没有并发事务可以同时修改该用户。

这只是一个例子。您需要找到一个很有可能以一致的顺序获取锁定的方案。

对于读取操作,可以使用快照隔离。

无论如何,许多应用程序在特定点上只有死锁。也许你可以忽略这个问题,通过改变一小段代码来修复生产中的任何虚假死锁。

0

您没有提及您正在使用或正在考虑的数据库产品。在PostgreSQL中(如果这是您的选择),有一种技术类似于乐观并发控制(OCC),但用于SERIALIZABLE事务的回滚较少。它被称为可串行快照隔离(SSI)。基本上,OCC基于单个读写反反依赖来取消事务,而如果存在多个读写反反依赖的模式,则SSI仅取消事务,如果不可序列化效果是可能的。

这是一种新技术,首次出版的学术论文在2008年首先提出在公共生产数据库PostgreSQL里的9.1,在2011年

发布显然,有很多其他的方式来处理这个问题,但你对OCC的兴趣似乎表明这可能会吸引你。每个在并发事务中保持完整性的技术都会涉及阻塞,事务回滚或两者兼而有之。 “传统的”严格的两阶段锁定(S2PL)技术更倾向于阻塞,而OCC和SSI的阻塞最小(因此具有更多的并发性),但在某些工作负载中可能会有更多的回滚。最好的技术使用肯定是工作量依赖。

您可以在the PostgreSQL documentation for the SERIALIZABLE transaction isolation level,a Wiki page with some examples,the initial paper from ACM SIGMOD 2008,the doctoral thesis of Michael J. Cahill或Dan R.K的论文中阅读更多关于SSI的内容。在VLDB 2012上已接受发布的端口和我自己,并且很快将由VLDB发布。