postgresql的每个表都有个内置的、隐藏的字段xmin,存储的是修改时或插入时的xid(transaction id),只要该行一被修改,该XMIN就有变化,不信大家可以尝试一下。
所以实际应用中可以将xmin当作表的时间戳来处理。在C/S结构的应用设计中,我们常常有这样的流程:
1,下载表的一个记录(不锁定)
2,让客户端对这个缓冲进行交互式的修改
3,提交更新时,要先检测这个记录是否被其他用户修改(此时锁定),假如这个记录被其他用户所修改,则不提交修改,否则提交缓冲。
这个流程类似于ado的batch update。在VFP中,这叫乐观锁定远程视图.
在比较缓冲是否被其他用户修改时,有2种比较方法,1种是只比较本地所修改的字段,另外1种是比较所有的字段。
假如是第2种,就可以用时间戳来比较,以下是例子
1。下载表的一个记录(不锁定)SELECT *, XMIN AS OLD_XMIN FROM XXX WHERE ...
2. 让客户端对这个缓冲进行交互式的修改
3. 提交更新时,
begin transaction;
select * , xmin as new_xmin from xxx where .... for update
if new_xmin <> old_xmin then
-- 已被他人修改,抛出错误或其他流程
rollback
else
update xxx set xxx=xxx where ...
commit
end
假如你的接口不接受xid数据类型, 可以将xid转换为integer,语句为cast(xmin as integer), 两者在postgresql内部都是同一类型, 不过xid 到 integer的类型转化不是postgresql内嵌的,所以还需要自定义这种转换
create cast (xid as integer) without function.
如果没有以上语句, cast(xmin as integer)可能不成功.
阅读(2021) | 评论(0) | 转发(0) |