svandragt/silverstripe-optimisticlocking

此包已被弃用且不再维护。未建议替代包。

通过阻止自当前用户加载以来数据发生变化时的保存过程,防止您的网站用户丢失数据。

安装: 7

依赖: 0

建议者: 0

安全性: 0

星标: 8

关注者: 4

分支: 3

公开问题: 0

类型:silverstripe-module

dev-master 2016-04-14 08:21 UTC

This package is not auto-updated.

Last update: 2020-01-20 03:37:31 UTC


README

这是一个非常简单的模块,可以防止您的网站用户丢失数据。它通过在数据被加载后发生变化时阻止保存过程来实现。(用户1开始编辑,用户2开始编辑,用户1保存,现在用户2不能覆盖用户1的更改)。默认情况下,Silverstripe 允许您在保存时覆盖数据库中的任何内容。

使用方法

  1. 使用 composer 安装 composer require "svandragt/silverstripe-optimisticlocking:*"

  2. 将 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 提供的原始解释。