1

c#应用程序。

我正在做一个选择,然后更新表中的一列。我将它们放在一个单独的事务中,隔离级别设置为可序列化。我这样做是为了实现数据一致性。

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

谁能建议我如何实现一致性,例如

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

4

6 回答 6

2

如果要防止这种情况发生,则称为悲观锁定。您可以使用 (Table|Row) 锁来执行此操作,但这会影响您的性能。

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

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

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

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

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

于 2010-07-09T15:54:17.260 回答
1

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

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

处理 .NET 中的并发问题

于 2010-07-09T15:53:19.260 回答
1

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

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

于 2010-07-09T15:54:41.720 回答
0

完成任务的一种方法:您必须在表格中添加一个“锁定”字段。

那么你应该编写一个存储过程,它将一些 ID 作为参数,原子地选择一个具有 NULL 锁的行,更新该行以使锁包含传递的 id,然后返回该值。

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

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

于 2010-07-09T16:06:25.440 回答
0

如何在 stroed proc 中返回更新并从我的应用程序中调用它。

这会解决所有问题吗?

于 2010-07-09T17:38:40.347 回答
0

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

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

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

如果您使用 SERIALIZABLE 事务,则不会出现此问题。

于 2010-07-10T08:47:21.890 回答