丢失更新解决方案



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

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

似乎READ_COMMITTEDREAD_COMMITTED_SNAPSHOT不支持Update conflict detection,只有SNAPSHOT支持它。来源:了解基于行版本控制的隔离级别。

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

如果使用READ_COMMITTEDREAD_COMMITTED_SNAPSHOT,则必须在应用层解决丢失更新问题。以下是在实体框架中完成行版本控制的方法。

这是

一篇很好的文章,解释了丢失的更新问题 - https://vladmihalcea.com/a-beginners-guide-to-database-locking-and-the-lost-update-phenomena/它建议REPEATABLE-READ隔离级别,并且它实际上有效(在这种情况下在Postgres中)。

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

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

相关内容

最新更新