c#应用程序。
我正在做一个选择,然后更新表中的一列。我将它们放在一个单独的事务中,隔离级别设置为可序列化。我这样做是为了实现数据一致性。
但我仍然可以检查多个用户是否能够读取(选择)相同的值并最终尝试使用相同的值进行更新。
谁能建议我如何实现一致性,例如
没有两个用户读取相同的值。
没有用户读取已更新但尚未提交的值。
c#应用程序。
我正在做一个选择,然后更新表中的一列。我将它们放在一个单独的事务中,隔离级别设置为可序列化。我这样做是为了实现数据一致性。
但我仍然可以检查多个用户是否能够读取(选择)相同的值并最终尝试使用相同的值进行更新。
谁能建议我如何实现一致性,例如
没有两个用户读取相同的值。
没有用户读取已更新但尚未提交的值。
如果要防止这种情况发生,则称为悲观锁定。您可以使用 (Table|Row) 锁来执行此操作,但这会影响您的性能。
“标准”方式是使用乐观并发并在问题发生后解决问题。
没有两个用户读取相同的值。
您可以(仅)通过一次仅允许 1 个连接来确保这一点。
没有用户读取已更新但尚未提交的值。
这只需要(更轻的)ReadCommitted 隔离级别。
我认为您指的是Concurrency。查看链接以开始理解它,如果这是您所问的。根据您的后端和您的具体情况,您可能需要做更多的研究。同样,如果这是您正在寻找的内容,您可能对悲观并发特别感兴趣。
http://en.wikipedia.org/wiki/Concurrency_control
处理 .NET 中的并发问题
有很多不同的方法可以实现这一目标。您可以在记录上使用时间戳。当您进行更新时,请确保 id 匹配并且您的应用程序提取的时间戳与记录匹配。
为了避免让用户读取未提交的记录,请查看在查询中使用 sql 提示。
完成任务的一种方法:您必须在表格中添加一个“锁定”字段。
那么你应该编写一个存储过程,它将一些 ID 作为参数,原子地选择一个具有 NULL 锁的行,更新该行以使锁包含传递的 id,然后返回该值。
只要存储过程以原子方式执行(对表的任何其他请求都将等到这个完成),每个调用此过程的客户端都会获得另一个值,但它的锁定字段仍然为空。一旦返回值,客户端确信包含该值的行将其锁定字段设置为某个值,并且不会返回。
进行修改后,您应该更新行,写入新值并将锁定字段设置为 NULL,从而为将来的请求“解锁”该行。
如何在 stroed proc 中返回更新并从我的应用程序中调用它。
这会解决所有问题吗?
没有两个用户读取相同的值。
为此,请在 SET TRANSACTION 语句中添加 RESERVING mytable FOR PROTECTED WRITE(或数据库上的本地等效项)。
没有用户读取已更新但尚未提交的值。
如果您使用 SERIALIZABLE 事务,则不会出现此问题。