c#application。
我正在执行select,然后更新表中的列。我将这些放在一个单独的事务中,隔离级别设置为Serializable。我这样做是为了实现数据的一致性。
但我仍然可以检查多个用户是否能够读取(选择)相同的值并最终尝试使用相同的值进行更新。
任何人都可以建议我如何实现一致性,例如
没有两个用户读取相同的值 没有用户读取已更新但尚未提交的值。
答案 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交易,则不会出现此问题。