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