我有一个通用的Java多用户客户端服务器CRUD系统,其中每个用户都通过SELECT
获取所有项,通过INSERT
添加新项,通过DELETE
删除现有项并修改现有项UPDATE
中的项目。
所有表都包含date_last_modified TIMESTAMPTZ
和user_last_modified INTEGER REFERENCES users(id)
列。
我想防止一种情况,首先是每个用户SELECT
管理所有项目,然后几个用户修改相似的项目,而每个随后的UPDATE都会覆盖以前的数据。
我正在尝试创建一个UPDATE
查询,以比较客户端和服务器上的date_last_modified
值,如果值不相等(意味着有人已经对其进行了修改),则中止查询。
如果存在另一种方法来处理缓存项目较旧的情况,那么欢迎您使用DB中的方法。
答案 0 :(得分:0)
我认为您的方法不错,但也许可以在更新之前使用触发器来实现它
答案 1 :(得分:0)
您的方法还可以,但是您可以通过向{p>添加date_last_modified
来避免中止查询(也避免在事务中预先查询时间戳以比较值)
UPDATE ... WHERE ... AND date_last_modified = ?
如果时间戳不匹配,则不会更新任何行。
Statement.executeUpdate(...)
返回更新的行数。如果为0,则可以通知用户竞争情况(并在需要时回滚事务)。
您也可以为此添加列serial update_count
。但是,如果每次更新都更改了值,则timestampz
可以。