我知道,可以使用下面的代码来实现乐观锁定,但是缺点是用户或应用程序必须刷新并重试失败的更新。如何解决问题,使用户或应用程序不会陷入此类失败的错误?
public class User {
@Id
private Long id;
@Version
private Long version;
}
我知道,可以使用下面的代码来实现乐观锁定,但是缺点是用户或应用程序必须刷新并重试失败的更新。如何解决问题,使用户或应用程序不会陷入此类失败的错误?
public class User {
@Id
private Long id;
@Version
private Long version;
}
您可以使用使用版本的乐观锁定或使用数据库锁的悲观锁定。
乐观意味着您希望永远不会发生并发更改,如果会,其中一个用户将获胜,第二个(或第三个等)将不得不从数据库更新它的实体并再次执行更改。由于它没有在 DB 层使用任何额外的锁定,它只是为您的系统/DB 提供了巨大的吞吐量。
另一方面,您可以使用悲观锁定,一旦用户开始编辑实体就会锁定实体。锁在底层事务获得提交/回滚的同时被释放。没有人可以从数据库中获取实体,所以大多数情况下用户需要等到另一个用户的事务提交。明显的优点是不再出现此类错误,缺点是吞吐量较低。
为了解决您的问题,您可以通过应用多种技术来“解决”乐观锁定问题。它们都不是完美的,并且取决于您的方案,但这是您可以做的:
您可以再次从数据库中检索记录,然后再次尝试更新。如果仅更改了新字段,这将起作用。否则,它可能会导致您的用户感到困惑。如果用户根据已被其他用户更改的字段的值做出决定,也可能导致不一致。
您可以告诉用户重新加载页面,告诉 hem 有更改,或者为他们重新加载页面。这迫使他们有可能再次做他们的工作。
这需要一些认真的努力和可能的经验,但是对于使用事件溯源(不一定是 CQRS)的系统,您只需在事件发生时记录它们,然后您可以从事件中重建您的实体。不过,这必须与您的域匹配;并非所有域都适合 ES。