use*_*521 3 postgresql postgresql-9.3
我正在使用Postgres 9.3
.
当我更新表中的行时,我的流程如下所示:
SELECT * FROM tbl WHERE id = 1
)UPDATE tbl SET .... WHERE id = 1
)问题是old
数据可能在第 2 点期间发生变化,因此验证,即使通过也可能是outdated
在第 3 点(更新行)期间。我知道我可以执行这样的更新UPDATE .... WHERE id = 1 AND column1='oldValue'
以确保某些字段不会更改,但是我的验证(也比较新旧值)非常复杂,我无法在 SQL UPDATE 语句中“编写”它。
所以我想到了这样的事情:
BEGIN
SELECT * FROM tbl WHERE id = 1
UPDATE SET=... WHERE id = 1
COMMIT
COMMIT
如果在事务执行期间 id = 1 的行发生更改,我想失败。是否可以使用这样的交易?如果不是,其他解决方案是什么?
不确定为什么不直接在 where 子句中使用附加谓词进行更新,但如果不可能,您可以选择更新,如下所示:
SELECT * FROM tbl WHERE id = 1 FOR UPDATE
Run Code Online (Sandbox Code Playgroud)
这将锁定所选行并防止在您进行验证时对其进行更新。
归档时间: |
|
查看次数: |
1822 次 |
最近记录: |