C# 丢失的更新解决方案

C# 丢失的更新解决方案,c#,sql-server,entity-framework,transactions,C#,Sql Server,Entity Framework,Transactions,我想解决我的应用程序中的丢失更新问题,即在读取和更新一个事务和另一个事务之间进行更新的问题 我想知道的是,我是否可以通过在SQL Server中设置特定的隔离级别(READ_COMMITTED、READ_COMMITTED_SNAPSHOT或SNAPSHOT)来解决这个问题,或者我必须在应用层实现逻辑,比如将行版本字段添加到我的实体类中,并手动检查它,并在发生时进行回滚。为防止更新丢失,事务必须在至少可重复读取的隔离级别上运行,并与应用层中的事务块相结合。为防止更新丢失,事务必须在至少可重复读取

我想解决我的应用程序中的丢失更新问题,即在读取和更新一个事务和另一个事务之间进行更新的问题


我想知道的是,我是否可以通过在SQL Server中设置特定的隔离级别(READ_COMMITTED、READ_COMMITTED_SNAPSHOT或SNAPSHOT)来解决这个问题,或者我必须在应用层实现逻辑,比如将行版本字段添加到我的实体类中,并手动检查它,并在发生时进行回滚。

为防止更新丢失,事务必须在至少可重复读取的隔离级别上运行,并与应用层中的事务块相结合。

为防止更新丢失,事务必须在至少可重复读取的隔离级别上运行,与应用层中的事务块相结合。

似乎
读取提交的
读取提交的
快照不支持
更新冲突检测
,只有
快照
支持它。来源:

因此,为了解决数据库层
快照中丢失的更新,必须使用隔离级别


如果使用了
READ\u COMMITTED
READ\u COMMITTED\u SNAPSHOT
,则必须在应用层解决丢失更新问题。这是如何做到的。

似乎
读取已提交的
读取已提交的\u快照
不支持
更新冲突检测
,只有
快照
支持它。来源:

因此,为了解决数据库层
快照中丢失的更新,必须使用隔离级别


如果使用了
READ\u COMMITTED
READ\u COMMITTED\u SNAPSHOT
,则必须在应用层解决丢失更新问题。下面是如何完成的。

这篇文章很好地解释了丢失更新的问题- 它建议使用可重复读取隔离级别,并且它实际上是有效的(在本例中是在Postgres中)


但例如,在mysql中,可重复读取并不能解决丢失的更新,您必须使用某种锁定,例如
SELECT。。。对于更新
-

这篇文章很好地解释了丢失更新的问题- 它建议使用可重复读取隔离级别,并且它实际上是有效的(在本例中是在Postgres中)


但例如,在mysql中,可重复读取并不能解决丢失的更新,您必须使用某种锁定,例如
SELECT。。。对于更新
-

我想要乐观锁定,而不是悲观锁定。如果您的目标是提高并发性,而不是在读取操作期间锁定数据,那么您可以利用读取提交的快照隔离。您可以通过更改数据库或在特定表上运行快照隔离事务来启用RCSI。更改数据库:更改数据库dbName设置允许\u快照\u隔离打开;设置事务隔离级别快照;BEGIN TRAN SELECT*FROM TABLE我想要乐观锁定,而不是悲观锁定。如果您的目标是提高并发性,而不是在读取操作期间锁定数据,则可以利用读取提交的快照隔离。您可以通过更改数据库或在特定表上运行快照隔离事务来启用RCSI。更改数据库:更改数据库dbName设置允许\u快照\u隔离打开;设置事务隔离级别快照;开始传输从表中选择*