丢失更新解决方法
Lost update solution
我想解决我的应用程序中丢失更新的问题,即在一个事务的读取和更新之间另一个事务进行更新时的问题。
我想知道的是,我是否可以通过在 SQL 服务器(READ_COMMITTED、READ_COMMITTED_SNAPSHOT 或 SNAPSHOT)中设置一定的隔离级别来解决它,或者我必须实施应用层的逻辑,比如将行版本字段添加到我的实体类,并手动检查它并在发生时进行回滚。
为防止更新丢失,事务必须运行处于至少可重复读取的隔离级别,并与应用程序层中的事务块相结合。
好像READ_COMMITTED
和READ_COMMITTED_SNAPSHOT
不支持Update conflict detection
,只有SNAPSHOT
支持。资料来源:Understanding Row Versioning-Based Isolation Levels.
因此要解决 DB 层丢失更新的问题 SNAPSHOT
必须使用隔离级别。
如果使用READ_COMMITTED
或READ_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
我想解决我的应用程序中丢失更新的问题,即在一个事务的读取和更新之间另一个事务进行更新时的问题。
我想知道的是,我是否可以通过在 SQL 服务器(READ_COMMITTED、READ_COMMITTED_SNAPSHOT 或 SNAPSHOT)中设置一定的隔离级别来解决它,或者我必须实施应用层的逻辑,比如将行版本字段添加到我的实体类,并手动检查它并在发生时进行回滚。
为防止更新丢失,事务必须运行处于至少可重复读取的隔离级别,并与应用程序层中的事务块相结合。
好像READ_COMMITTED
和READ_COMMITTED_SNAPSHOT
不支持Update conflict detection
,只有SNAPSHOT
支持。资料来源:Understanding Row Versioning-Based Isolation Levels.
因此要解决 DB 层丢失更新的问题 SNAPSHOT
必须使用隔离级别。
如果使用READ_COMMITTED
或READ_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