更新失败时返回值的解决方法



我正试图找到一种方法,在相同的更新失败时,返回当前用作更新条件的单元格值:

UPDATE public.streams
SET version = 1
WHERE id = '0171c6f4-7c44-43dd-ae85-530a77608d8e'::UUID
AND version = 0
RETURNING version

上面代码的问题是,RETURNING只有在UPDATE成功的情况下才起作用,无论结果如何,我都想得到它(实际上,我想得到version的值和结果(如TRUEFALSE(,也就是说,更新是否失败(。

在乐观行锁定中,如果您试图更新已被另一个线程更改的行,那么更新当然会失败。

现在,该行的当前版本实际上是另一行,而不是同一行(至少对于数据库(。

一般来说,您有两种选择:

  • 考虑您的更改已过时,并通过回滚整个事务来丢失它们。

  • 刷新数据,并尝试以某种方式通过合并版本来恢复新更改。

在我看来,您正试图实现后者。如果是这种情况,则需要刷新数据,这必然意味着执行全新的SELECT。。。与您尝试的失败的UPDATE分离。我不认为可以将两者合并为一个查询。

最新更新