仅当缓存的值不早于当前值时,才更新项目

时间:2020-01-10 21:20:04

标签: java postgresql caching

我有一个通用的Java多用户客户端服务器CRUD系统,其中每个用户都通过SELECT获取所有项,通过INSERT添加新项,通过DELETE删除现有项并修改现有项UPDATE中的项目。

所有表都包含date_last_modified TIMESTAMPTZuser_last_modified INTEGER REFERENCES users(id)列。

我想防止一种情况,首先是每个用户SELECT管理所有项目,然后几个用户修改相似的项目,而每个随后的UPDATE都会覆盖以前的数据。

我正在尝试创建一个UPDATE查询,以比较客户端和服务器上的date_last_modified值,如果值不相等(意味着有人已经对其进行了修改),则中止查询。

如果存在另一种方法来处理缓存项目较旧的情况,那么欢迎您使用DB中的方法。

2 个答案:

答案 0 :(得分:0)

我认为您的方法不错,但也许可以在更新之前使用触发器来实现它

答案 1 :(得分:0)

您的方法还可以,但是您可以通过向{p>添加date_last_modified来避免中止查询(也避免在事务中预先查询时间戳以比较值)

UPDATE ... WHERE ... AND date_last_modified = ?

如果时间戳不匹配,则不会更新任何行。

Statement.executeUpdate(...)返回更新的行数。如果为0,则可以通知用户竞争情况(并在需要时回滚事务)。

您也可以为此添加列serial update_count。但是,如果每次更新都更改了值,则timestampz可以。