如何确保数据的一致性

时间:2010-07-09 15:45:51

标签: c# sql transactions isolation-level

c#application。

我正在执行select,然后更新表中的列。我将这些放在一个单独的事务中,隔离级别设置为Serializable。我这样做是为了实现数据的一致性。

但我仍然可以检查多个用户是否能够读取(选择)相同的值并最终尝试使用相同的值进行更新。

任何人都可以建议我如何实现一致性,例如

没有两个用户读取相同的值 没有用户读取已更新但尚未提交的值。

6 个答案:

答案 0 :(得分:2)

如果你想阻止这就叫做悲观锁定。您可以使用(表格|行)锁定来执行此操作,但这会导致您的性能下降。

“标准”方法是使用乐观并发并在发生后解决问题。

  

没有两个用户读取相同的值。

您可以(仅)通过一次只允许1个连接来确保这一点。

  

没有用户读取已更新但尚未提交的值。

这只需要(更轻)ReadCommitted隔离级别。

答案 1 :(得分:1)

我认为你指的是并发。查看链接以开始了解它,如果这是您要问的。您可能需要根据您的后端和具体情况进行更多研究。同样,如果这是您正在寻找的,您可能会特别感兴趣悲观并发。

http://en.wikipedia.org/wiki/Concurrency_control

Handling Concurrency Issues in .NET

答案 2 :(得分:1)

有很多不同的方法可以实现这一目标。您可以在记录上使用时间戳。当您进行更新时,请确保id匹配,并确保应用程序随记录匹配的时间戳匹配。

为避免让用户读取未提交的记录,请查看在查询中使用sql提示。

答案 3 :(得分:0)

完成任务的一种方法: 你必须在你的桌子上添加一个“锁定”字段。

然后你应该编写一个存储过程,它将一些ID作为参数,自动选择一个带有NULL锁的行,更新该行,以便锁定将包含传递的id,然后返回值。

只要存储过程以原子方式执行(对表的任何其他请求将等到这一个完成),每个调用此过程的客户端将获得另一个仍然将其锁定字段为空的值。返回值后,客户端确信包含该值的行的锁定字段设置为某个值,并且不会返回。

执行修改后,您应该更新行,编写新值并将锁定字段设置为NULL,从而“解锁”该行以备将来请求。

答案 4 :(得分:0)

如何在存储过程中返回更新并从我的应用程序中调用它。

这会解决所有问题吗?

答案 5 :(得分:0)

没有两个用户读取相同的值。

要执行此操作,请在SET TRANSACTION语句中添加RESERVING mytable FOR PROTECTED WRITE(或数据库中的本地等效项)。

没有用户读取已更新但尚未提交的值。

如果您使用的是SERIALIZABLE交易,则不会出现此问题。