丢失更新解决方法

Lost update solution

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

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

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

好像READ_COMMITTEDREAD_COMMITTED_SNAPSHOT不支持Update conflict detection,只有SNAPSHOT支持。资料来源:Understanding Row Versioning-Based Isolation Levels.

因此要解决 DB 层丢失更新的问题 SNAPSHOT 必须使用隔离级别。

如果使用READ_COMMITTEDREAD_COMMITTED_SNAPSHOT,则必须在应用层解决Lost update问题。这是如何完成的 Row versioning in Entity framework.

这篇很好的文章解释了更新丢失问题 - 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