svandragt / silverstripe-optimisticlocking
通过阻止自当前用户加载以来数据发生变化时的保存过程,防止您的网站用户丢失数据。
Requires
This package is not auto-updated.
Last update: 2020-01-20 03:37:31 UTC
README
这是一个非常简单的模块,可以防止您的网站用户丢失数据。它通过在数据被加载后发生变化时阻止保存过程来实现。(用户1开始编辑,用户2开始编辑,用户1保存,现在用户2不能覆盖用户1的更改)。默认情况下,Silverstripe 允许您在保存时覆盖数据库中的任何内容。
使用方法
-
使用 composer 安装
composer require "svandragt/silverstripe-optimisticlocking:*" -
将 OptimisticLocking 类附加到您的数据对象/页面类型上,例如
Test数据对象Object::add_extension("Test","OptimisticLocking");
我保留了一个已知错误列表。
什么是乐观/悲观锁定?
这些是多用户问题处理的方法。如何处理两个人同时想要更新同一记录的情况?
1.什么也不做
- 用户1读取一条记录
- 用户2读取相同的记录
- 用户1更新该记录
- 用户2更新相同的记录
用户2现在已经覆盖了用户1所做的更改。这些更改完全消失了,就像它们从未发生过一样。这被称为“丢失更新”,也是 SilverStripe 默认的工作方式。
2.读取记录时锁定记录:悲观锁定
- 用户1读取一条记录并锁定它,通过在记录上放置排他锁(FOR UPDATE子句)
- 用户2试图读取并锁定相同的记录,但现在必须等待在用户1之后
- 用户1更新记录(当然,提交更改)
- 用户2现在可以读取记录并看到用户1所做的更改
- 用户2带着用户1的更改更新记录
丢失更新问题得以解决。这种方法的问题在于并发性。用户1锁定了一个可能永远不会更新的记录。用户2甚至不能读取记录,因为他们希望在读取时也需要排他锁。这种方法需要过多的排他锁,而且锁的时间过长(通常跨越用户控制 - 绝对禁止)。这种方法几乎从不实现。
3.使用乐观锁定。
乐观锁定在读取时不使用排他锁。相反,在更新过程中进行检查,以确保记录自读取以来没有被更改。此模块实现了这一点。
感谢chrisrlong 提供的原始解释。