2010-07-09 77 views
1

c#应用程序。如何确保数据一致性

我正在做一个select,然后更新表中的列。我把它们放在一个单独的事务中,隔离级别设置为Serializable。我正在这样做,以实现数据的一致性。

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

任何人都可以建议我如何能实现的一致性,使得

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

+0

您可能想要指定您正在使用的关系数据库系统 - SQL Server,MySQL,Oracle等。 – 2010-07-09 15:57:11

+0

Praveen,尤其如此,因为您的问题与C#完全没有关系。 – 2010-07-09 16:00:57

回答

2

如果你想防止这也就是所谓的悲观锁。你可以用(Table | Row)锁来做到这一点,但它会杀死你的表现。

'标准'方式是使用乐观并发,并在发生后解决问题

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

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

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

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

+0

如何将更新与返回在一个特殊的过程中,并从我的应用程序中调用它。 这会照顾所有问题吗? – Praveen 2010-07-09 17:37:55

+0

不,存储过程不会改变问题。 – 2010-07-10 07:55:27

1

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

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

0

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

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

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

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

0

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

这会照顾所有问题吗?

0

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

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

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

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

相关问题