失去了更新解决方案

时间:2016-03-17 14:28:32

标签: c# sql-server entity-framework transactions

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

我想知道的是,我是否可以通过在SQL Server(READ_COMMITTED,READ_COMMITTED_SNAPSHOT或SNAPSHOT)中添加某些隔离级别来解决它,或者我必须在应用程序层中实现逻辑,例如向我的实体添加行版本字段类,并手动检查它并在发生时进行回滚。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

似乎READ_COMMITTEDREAD_COMMITTED_SNAPSHOT不支持Update conflict detection,只有SNAPSHOT支持它。来源:Understanding Row Versioning-Based Isolation Levels

因此,要解决数据库层SNAPSHOT中丢失的更新,必须使用隔离级别。

如果使用READ_COMMITTEDREAD_COMMITTED_SNAPSHOT,则必须在应用层解决丢失更新问题。以下是Row versioning in Entity framework的完成方式。

答案 2 :(得分:0)

这是解释丢失更新问题的好文章 - https://vladmihalcea.com/a-beginners-guide-to-database-locking-and-the-lost-update-phenomena/ 它建议REPEATABLE-READ隔离级别,它实际上有效(在本例中为Postgres)。

但是,例如,在mysql中,repeatable-read并不能解决丢失的更新,你必须使用某种锁定,例如SELECT ... FOR UPDATE - http://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html