C# 如何确保数据一致性

C# 如何确保数据一致性,c#,sql,transactions,isolation-level,C#,Sql,Transactions,Isolation Level,c#应用程序 我正在进行选择,然后更新表中的一列。我将它们放在一个单独的事务中,隔离级别设置为Serializable。我这样做是为了实现数据一致性 但我仍然可以检查多个用户是否能够读取(选择)相同的值,并最终尝试使用相同的值进行更新 有人能建议我如何实现一致性吗 没有两个用户读取相同的值。 没有用户读取已更新但尚未提交的值。我认为您指的是并发性。查看链接,开始了解它,如果这是你要问的。根据您的后端和具体情况,您可能需要做更多的研究。同样,如果这是您正在寻找的,那么您可能对悲观的并发性特别感兴趣

c#应用程序

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

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

有人能建议我如何实现一致性吗

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

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

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




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



如果要防止这种情况,则称之为悲观锁定。您可以使用(表|行)锁执行此操作,但这会降低性能

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

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

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

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

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

如果要防止这种情况,则称之为悲观锁定。您可以使用(表|行)锁执行此操作,但这会降低性能

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

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

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

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


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

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


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

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


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

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

然后,您应该编写一个存储过程,将某个ID作为参数,原子地选择一个具有NULL lock的行,更新该行,使lock包含传递的ID,然后返回值

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


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

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

然后,您应该编写一个存储过程,将某个ID作为参数,原子地选择一个具有NULL lock的行,更新该行,使lock包含传递的ID,然后返回值

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


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

将更新放在strood proc中并从我的应用程序调用如何


这能解决所有问题吗?

将返回的更新放在stroed进程中,并从我的应用程序调用它,怎么样


这会解决所有问题吗?

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

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

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


如果您使用的是可序列化事务,则不会出现此问题。

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

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

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


如果您使用的是可序列化事务,您就不会有这个问题。

您可能需要指定您使用的是什么关系数据库系统—SQL Server、MySQL、Oracle等。Praveen,这一点尤其正确,因为您的问题与C无关,您可能需要指定什么关系数据库系统