【问题标题】:How to prevent two user to access same data from sql server如何防止两个用户从 sql server 访问相同的数据
【发布时间】:2013-10-30 08:30:19
【问题描述】:

我真的不知道防止两个用户从 sql server 访问相同数据的最佳方法是什么。我使用 c# 开发了一个 win 应用程序,用户单击记录以对其进行修改。当用户单击记录时,会显示一个新表单,其中包含用户可以修改数据的数据。假设我的应用程序在两台电脑上运行,两个用户打开相同的记录,然后谁最后更新相同的数据,这些数据将保存在数据库中。

所以我做了什么...每当任何用户打开数据记录时,我都会创建一个表并将记录 ID 存储在该表中。如果记录 ID 存储在表中,那么下次另一个用户无法访问该数据,而是获取消息谁正在处理这些记录。这样我的目的就解决了,但我不知道这是正确的还是最好的方法。

所以大家告诉我如何用最好的方法处理这种情况。谢谢

【问题讨论】:

  • 你使用的是哪个 ORM?
  • 如果您的第一个用户在没有任何确认或回滚的情况下关闭您的应用程序,此支持表中会发生什么情况? (即停电或其他)
  • 试试这个关于锁定的链接:stackoverflow.com/questions/129329/…
  • 我通常会推荐乐观并发——锁往往会导致需要允许覆盖/强制解锁,以及史蒂夫暗示的清理。两个用户可能访问同一记录的频率如何?
  • 我没有使用 ORM,而是使用 ADO.DotNet 数据阅读器从 sql server 2005 db 中获取数据。

标签: c# sql-server


【解决方案1】:

您有多种解决方案。

如果您只在短时间内访问一个表,则可以创建行锁。

您可以在获取数据和写入数据之间创建事务。 但是您应该始终注意称为杯咖啡的综合症:p人们检索数据,离开并阻止数据。

尝试让用户修改、保存和比较您在 c# 代码中的先前结果,如果不同,请向客户提出建议。如果他接受打开交易然后保存

【讨论】:

  • 您说:- 您可以在短时间内创建行锁。所以请指导我如何详细创建行锁。
  • 请更详细地讨论这一点......你说:- 尝试让用户修改、保存和比较你在 c# 代码中的先前结果,如果它不同,请给出建议客户端。如果他接受打开交易然后保存
【解决方案2】:

添加三列

  1. 版本(时间戳)
  2. editBy 外键给编辑记录的用户
  3. editAt(日期时间)

工作流程

  1. 获取所有记录
  2. 允许编辑所有 editBy 为 null 或 editBy == currentUser 的记录
  3. 打开表单执行命令更新记录集@editBy = currentUser, @editAt=getdate() where @id=id and @version = currentVersion 并检查受影响的行。如果有 1 条记录,则我们处于编辑模式,如果没有刷新记录。
  4. 在保存记录更改字段(editBy、editAt)时返回。
  5. 用于处理版本超时的附加服务器逻辑。例如不超过 30 分钟。

【讨论】:

  • 如果我按版本执行,那么最后谁尝试保存记录,那么我需要强制该用户再次重新加载数据并保存。这样我不想实现我的目标。相反,我喜欢在获取数据时锁定一行,而当再次保存数据时,该行将被解锁。任何想法 ?谢谢
  • 好的,再添加一列(editMode)。在打开的表单上更新此标志(使用 update table set editMode = 1 where @id=id and @version=myCurrentVersion 之类的语句)。检查受影响的行数以确保没有其他用户更快:-) 另一件事列editedBy(user) 和editedAt(DateTime) 帮助处理超时并将用户返回到版本。
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2021-11-16
相关资源
最近更新 更多