1

我尝试使用 Java/JDBC 和 MySQL 以及用于并发处理的乐观锁定来实现活动记录模式。

现在,我有一个表中所有记录的“version_number”字段,每次更新后都会递增。

似乎有两种策略可以实现这一点:

  1. 应用程序在请求数据时还存储每个对象(即记录)的相应版本号。在更新时,版本号被“发送”到数据层,该数据层用于 UPDATE...SET...WHERE 查询以进行乐观锁定
  2. 应用程序不存储版本号,而只存储对象的某些部分(而不是整行数据)。为了使乐观锁定成功,数据层(活动记录)需要首先从数据库中获取“行”,获取版本号,然后触发相同的 UPDATE...SET...WHERE 查询以更新记录。

前者有“第一次获取”,然后是更新。在后一种情况下,您确实有一个“第一次提取”,但在更新之前有一个提取。

问题是:按照设计,哪种方法更好?将所有数据(包括版本号)存储在 Web 应用程序的前端(Javascript/HTML)中是否可以/安全/正确?还是在更新前对性能进行读取会更好?

有没有“正确的方法”来实现这个设计?我不确定活动记录的当前实现如何处理这个(Ruby、Play、ActiveJDBC 等)如果我要在 JDBC 中“原始”实现它,在这种情况下,正确的设计决策是什么?

4

2 回答 2

1

这既不是性能问题,也不是安全问题,两种方法在功能上不同,实现的目标也不同。

使用第一种方法,您可以在用户的​​整个“思考时间”中乐观地锁定该行。如果用户 1 加载屏幕,然后用户 2 进行更改,用户 1 的更改将失败,他们将看到他们正在查看过期数据的错误。

使用第二种方法,您只能防止竞争请求线程之间的交错写入。用户 1 可能会加载一个页面,然后用户 2 进行更改,然后当用户 1 点击提交时,他们的更改将通过并吹出用户 2 的更改。用户 1 可能已经根据过时的信息做出了决定,并且永远不知道。

问题在于哪种行为是您想要的业务规则,而不是技术上“正确”的一种行为。它们都是有效的,它们做不同的事情。

于 2012-03-17T06:29:23.657 回答
1

ActiveJDBC实现版本 1。使用版本 2,您可能会引入竞争条件

于 2012-04-23T19:22:31.400 回答