PostgreSQL中的SELECT FOR UPDATE查询含义

4
以下查询在PostgreSQL中的含义是什么?我知道它与锁定相关,但有人能解释一下吗?
select col1, col2 from table where col1=123 for update;

实际上我有一个类似于下面的表格:

id  col1  col2  receipt_id  receipt_year
1   ddd   ggg   1           2018
2   ddd   eee   2           2018

我需要每年将receipt_id重置为1,例如1/2017、1/2018等。 我正在使用查询。
select max(receipt_id) from table where receipt_year=$current_year;

如果找到id,则将其加1,否则将其设置为1。这样做是否正确?
id  col1  col2  receipt_id  receipt_year
1   ddd   ggg   1           2018
2   ddd   eee   2           2018

2019年:

id  col1  col2  receipt_id  receipt_year
1   ddd   ggg   1           2018
2   ddd   eee   2           2018
3   lol   lpl   1           2019 

目前我是这样做的:

$current_year = date('Y');
$sql = SELECT MAX(receipt_id) AS receipt_id FROM table WHERE receipt_year=:year;
$stmt = $conn->prepare($sql);
$stmt->execute(array(':year' => $current_year));
$receipt_ido = $stmt->fetchColumn();

if ( ! empty($receipt_ido)) {
   $receipt_id = ($receipt_ido + 1);
} else {
   $receipt_id = 1;
}

编辑您的问题并向我们展示更多的样本数据行。然后,展示给我们输出应该是什么。您的语言不够清晰(至少对我来说不够清晰)。 - Tim Biegeleisen
展示在重置“receipt_id”之前和之后的表格。 - Tim Biegeleisen
我建议您开一个新的问题。除了我之外,没有人会看到这个帖子。 - Tim Biegeleisen
1个回答

7

文档清楚地解释了FOR UPDATE子句的作用:

FOR UPDATE会使SELECT语句检索到的行像进行更新一样被锁定。这将防止其他事务在当前事务结束之前修改或删除它们。也就是说,尝试更新、删除或使用SELECT FOR UPDATE语句检索这些行的其他事务将被阻塞,直到当前事务结束。

此外,FOR UPDATE将等待另一个具有记录更新锁的事务完成才开始。

换言之,在SELECT的末尾标记FOR UPDATE可以确保选择在没有同时进行更新的情况下完成。这意味着您的选择将返回数据的准确快照,而不可能从记录中获取中间数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接