锁定整个数据库?

4

我有一个非常奇怪的用户需求。我已经尝试向他们解释,有更好的支持业务流程的方式,但他们不想听。我很想放弃,但首先想看看是否还有其他方法。

有没有办法锁定整个数据库,而不是行锁或表锁。我知道我可以将数据库置于单用户模式,但这意味着一次只能有一个人使用它。我希望许多人能够同时阅读,但一次只能有一个人能够写入。

他们正在尝试进行一些非常奇怪的数据迁移。


7
有时候离开是正确的选择。 - Steve De Caux
1个回答

7

你想要实现什么目标?

  • 您是否想使整个数据库只读?您绝对可以这样做。
  • 您是否想阻止任何新客户端连接到数据库?您也绝对可以这样做。

但是,从只允许一个人使用数据库的角度来看,“数据库锁”的概念确实不存在。至少在 SQL Server 中没有,我不知道其他情况。那样对您有什么好处呢?

如果您想对此数据库进行数据迁移,则将数据库设置为只读模式(或创建其快照副本)可能已经足够且最简单的方法。

更新: 对于您提到的场景(获取具有笔记本电脑的人的数据,然后重新同步),您应该绝对查看ADO.NET Sync Services - 那正是它的用途!

即使您无法使用 ADO.NET Sync Services,您仍然应该能够有选择地并智能地更新中央数据库,而无需锁定整个数据库。SQL Server 有几种方法可以在数据库正在使用时更新行 - 真的没有必要完全锁定整个数据库以仅更新几行!

例如:您应该在每个数据表上有一个TIMESTAMP(或 ROWVERSION)列,这将轻松地使您看到是否发生了任何更改。如果 TIMESTAMP 字段(实际上只是一个计数器 - 它与日期或时间无关)没有更改,则行未更改,因此不需要考虑更新。


他们想要一个中央数据库。当有人带着笔记本电脑离开时,他们想要将最新的数据副本拉到本地数据库。当他们回来时,他们希望能够将更改推送到中央数据库。我只是想防止两个人同时更新相同的数据并且更改是最后的情况。或者一个人在另一个人读取时进行更新。他们似乎没有意识到这是非常危险的情况。 - uriDium
那么,你可以看看 ADO.NET 同步框架 - 这个框架专门为这种情况设计的。你可以拥有一个“偶尔连接”的客户端,并且它会处理所有混乱的特殊情况,并允许你定义如何处理冲突的策略。 - marc_s
刚看到你的更新。我以前用过类似的技术创建了一个类似的产品,使用发布者和订阅者模型。唯一的问题是这需要几个月的时间,而客户希望在下周得到可用的东西。我猜这在IT行业很常见。 - uriDium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接