我有这样的场景,
我的环境是.Net2.0,VS 2008,Web Application
当两个成员同时尝试访问时,我需要锁定记录。
我们可以通过两种方式
通过前端(将 sessionID 和记录唯一编号放入字典中并将其保存为静态或应用程序变量),当响应离开该页面,客户端未连接时,单击 post 按钮后,我们将释放会话结束。
通过后端(数据库本身的记录锁定 - 需要研究 - 我的团队成员正在寻找)。
还有其他方法吗?我是否需要在每个步骤中查看其他方法?
我是否缺少任何条件?
我有这样的场景,
我的环境是.Net2.0,VS 2008,Web Application
当两个成员同时尝试访问时,我需要锁定记录。
我们可以通过两种方式
通过前端(将 sessionID 和记录唯一编号放入字典中并将其保存为静态或应用程序变量),当响应离开该页面,客户端未连接时,单击 post 按钮后,我们将释放会话结束。
通过后端(数据库本身的记录锁定 - 需要研究 - 我的团队成员正在寻找)。
还有其他方法吗?我是否需要在每个步骤中查看其他方法?
我是否缺少任何条件?
您不会为客户锁定记录,因为将记录锁定超过几毫秒几乎是数据库中最具破坏性的事情。您应该改用Optimistic Concurrency:您检测自上次读取后记录是否已更改并重新尝试事务(例如,您重新向用户显示屏幕)。实际实现的方式取决于您使用的数据库技术(ADO.Net、DataSets、Linq、EF 等)。
如果业务领域需要类似锁的行为,这些总是在数据库中作为保留逻辑实现:当显示一条记录时,它是“保留的”,因此其他用户无法尝试进行相同的事务。预订完成或超时或被取消。但是“保留”永远不会使用锁来完成,它总是将状态从“可用”显式更新为“保留”,或类似的东西。
这种模式也描述了 EAA 的 din P: Optimistic Offline Lock。
我同意拉穆斯的观点。但如果你需要它。创建一个名称为 IsInUse 的列作为位类型,如果正在访问,则将其设置为 true。由于其他人也将同时需要相同的数据,因此您需要将您的应用程序从崩溃中保存..因此,在检索数据的每个地方,您都必须检查 IsInUse 是否为 False。
如果你说的只是从 SQL Server 数据库的记录中读取数据,你不需要做任何事情!!!SQL Server 将尽一切努力管理对记录的多重访问。但是如果要操作数据,则必须使用Transaction。