2010-07-05 83 views
3

我的情况是这样,如何在两个成员尝试访问记录时锁定记录?

我的环境是.Net2.0,VS 2008,Web应用程序

我需要锁定记录时,两位成员都在同一时间试图访问。

我们可以做到这一点有两种方式,

  1. 通过前端(把会话ID,并记录在字典中唯一编号,并保持它作为一个静态或应用程序变量),我们将发布在响应是否离开该页面,客户端没有连接,点击后按钮并且会话结束后。 (通过DB本身的记录锁定 - 需要学习 - 我的团队成员正在寻找)。

是否有其他方法可以做,我是否需要在每个步骤中查看其他方法?

我是否缺少任何条件?

+0

如果您已经在使用数据库,您可以使用数据库的事务来实现您想要的功能吗?在事务中执行读取/更新,如果发生冲突,数据库将回滚失败的事务,然后处理失败? – sarnold 2010-07-05 05:34:22

+2

第一个问题:**为什么**你需要锁定?通常,今天的数据库使用乐观并发处理 - 你基本上假设一切都很顺利(99%的时间),并且不用担心类似的锁和类似的东西,而你只对1%的情况做出反应发生冲突 – 2010-07-05 05:58:10

+1

@sarnold:对于ASP.NET而言不是一个好主意,您会在用户在浏览器中输入/更改数据期间保持连接/事务处于打开状态吗?如果他关闭浏览器会发生什么情况?你需要有一些额外的代码来清理无效的锁。 – Gertjan 2010-07-05 06:14:49

回答

6

您不会锁定客户端的记录,因为锁定记录的时间超过几个毫秒就是数据库中最具破坏性的事情。您应该改用Optimistic Concurrency:您会检测记录自上次读取并重新尝试该事务后是否已更改(例如,您将屏幕重新显示给用户)。这实际上是如何实现的,取决于你使用的数据库技术(ADO.Net,DataSet,Linq,EF等)。

如果业务域需要类似锁的行为,那么它们总是作为数据库中的预留逻辑实现的:当显示记录时,它是'保留'的,以便其他用户不能尝试进行相同的事务。预订完成或超时或取消。但是'保留'永远不会使用锁来完成,始终是从“可用”到“保留”或类似的状态的显式更新。

该模式也描述了EAA的din P:Optimistic Offline Lock

0

如果你只谈论从SQL服务器数据库的记录中读取数据,你不需要做任何事情! SQL服务器将尽全力管理对记录的多重访问。但如果你想操纵数据,你必须使用Transaction

0

我同意拉莫斯。但如果你需要的话。创建一个名称类似IsInUse的列作为位类型,如果正在访问,则将其设置为true。因为其他人同时需要同样的数据,所以你需要保存你的应用程序免于崩溃..所以在检索数据的每个地方,你必须检查IsInUse是否为False。