用xmin当作表的时间戳(postgresql)

postgresql的每个表都有个内置的、隐藏的字段xmin,存储的是修改时或插入时的xid(transaction id),只要该行一被修改,该XMIN就有变化,不信大家可以尝试一下。
[b](XMIN会+1)[/b]
所以实际应用中可以将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)可能不成功.
[url]http://edu.codepub.com/2009/1130/18345.php[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值