我尝试使用Java / JDBC和MySQL实现活动记录模式以及用于并发处理的乐观锁定。
现在,我有一个'version_number'字段用于表中的所有记录,每次更新后都会增加。
似乎 2实施此策略:
在前者中有“第一次获取”,然后是更新。在后一种情况下,您确实在更新之前进行了“首次提取”,但还提取。
问题是:按设计,这是更好的方法?将所有数据(包括版本号)存储在Web应用程序的前端(Javascript / HTML)中是否可以/安全/正确?或者在更新之前获取读取性能更好?
实施此设计是否有“正确的方法”?我不确定当前的活动记录实现如何处理这个(Ruby,Play,ActiveJDBC等)如果我要在JDBC中实现它'raw'在这种情况下做出正确的设计决定?
答案 0 :(得分:1)
这既不是性能问题也不是安全问题,这两种方法在功能上是不同的,并且实现了不同的目标。
使用第一种方法,您乐观地锁定用户整个“思考时间”的行。如果用户1加载屏幕,则用户2进行更改,用户1的更改将失败,他们将看到错误,他们正在查看过期数据。
使用第二种方法,您只能防止竞争请求线程之间的交错写入。用户1可以加载页面,然后用户2进行更改,然后当用户1点击提交时,他们的更改将通过并吹灭用户2的更改。用户1可能已根据过期信息做出决定,但从不知道。
这是一个问题,哪个行为是您想要的业务规则,而不是一个或另一个在技术上“正确”。他们都是有效的,他们做不同的事情。
答案 1 :(得分:1)
ActiveJDBC实现版本1.对于版本2,您可能会引入竞争条件