`

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

阅读更多
postgresql的每个表都有个内置的、隐藏的字段xmin,存储的是修改时或插入时的xid(transaction id),只要该行一被修改,该XMIN就有变化,不信大家可以尝试一下。
(XMIN会+1)
所以实际应用中可以将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)可能不成功.
http://edu.codepub.com/2009/1130/18345.php
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics