以下查询在postgres中的含义是什么?我知道这是关于锁定的事情,但有人可以取悦。
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 / 201,等等。 我正在使用查询
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;
}
答案 0 :(得分:1)
documentation非常清楚FOR UPDATE
子句的作用:
FOR UPDATE会导致SELECT语句检索到的行被锁定,就像更新一样。这可以防止其他事务修改或删除它们,直到当前事务结束。也就是说,在当前事务结束之前,将阻止尝试UPDATE,DELETE或SELECT FOR UPDATE这些行的其他事务。
此外,FOR UPDATE
将等待另一个对记录具有更新锁定的事务在开始之前完成。
使用简洁的语言,标记到FOR UPDATE
末尾的SELECT
可确保完成选择,而不会在选择的同时进行任何更新。这意味着您的选择将返回数据的准确快照,而无法从记录中获取中间数据。