数据库锁定

本文关键字:锁定 数据库 | 更新日期: 2024-10-24 14:14:48

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

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

总之,我认为乐观锁定是一种选择。是否还有其他实施起来并不复杂的选项?我认为锁定和互斥是一种选择,但我想不出实现"if"条件的方法来查看哪条记录被阻止,这样就不会导致死锁。

数据库锁定

锁定数据的一种简单方法是在数据库上创建一个简单的表,其中包含以下列:

第1列:表名第2列:行id第3列:锁定(布尔值)毕竟你的软件可以读取这个表,知道哪个记录在修改中。

避免死锁就是按照正确的顺序获取锁。例如,在修改某个特定用户的数据之前,可以对该用户进行UPDROCK,这样就不会有并发事务同时修改该用户。

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

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

无论如何,许多应用程序只在特定的位置发生死锁。也许您可以忽略这个问题,只需更改一小段代码就可以修复生产中的任何虚假死锁。

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

这是一项新技术,首次发表在2008年的一篇学术论文中,并首次出现在2011年发布的PostgreSQL 9.1的公共生产数据库中。

显然,有很多其他方法可以解决这个问题,但你对OCC的兴趣似乎表明这可能对你很有吸引力。每一种在并发事务面前保持完整性的技术都会涉及阻塞、事务回滚或两者兼有。"传统的"严格两阶段锁定(S2PL)技术更倾向于阻塞,而OCC和SSI具有最小的阻塞(因此具有更高的并发性),但在某些工作负载中可以有更多的回滚。使用的最佳技术肯定是依赖于工作负载的。

您可以在PostgreSQL的SERIALIZABLE事务隔离级别文档、带有一些示例的Wiki页面、ACM SIGMOD 2008的第一篇论文、Michael J.Cahill的博士论文,或者Dan R.K.Ports和我自己的论文中阅读更多关于SSI的信息,该论文已被VLDB 2012接受并将很快由VLDB发布。