【发布时间】:2017-12-11 09:15:56
【问题描述】:
是否可以查明表中的一行是否已由当前事务创建(因此对于其他事务尚不可见,因为当前事务仍处于活动状态)?
我的用例:我正在向数据库添加事件日志记录。这是在 plpgsql 触发器中完成的。事件表中的一行如下所示:(event id:serial, event action:text, count:integer:default 1)。
现在,我的问题背后的原因是:如果此事务(很可能在另一个触发器中)创建了某个行,我可以增加计数,而不是在事件表中创建一个新行。
【问题讨论】:
-
您的实际用例是什么?你的问题是“种族条件”和“完整性问题”。
-
如果您的代码正在创建行,为什么不让它跟踪它创建的行呢?这样你甚至不需要再次查询数据库,你的代码可以立即发送一个 UPDATE。
-
这是在 几个 plpgsql 触发器中完成的。因此,我可以跟踪已创建事件的行(临时表?时间戳列?),或者更好的是,以某种方式找出。因此我的问题。
-
我想你可以在日志中添加一个事务 id 字段并保存
txid_current()。登录时可能使用ON CONFLICT。 -
谢谢。但是数据库如何跟踪受当前事务影响的行呢?不知何故,数据库需要相同的信息才能提交或回滚。我可以访问这些信息吗?如果是这样,我不需要按照您的建议手动保存事务 ID 并膨胀我的架构(个人感觉)?
标签: sql postgresql transactions commit