PostgresSQL 的 JSON 字段的并发控制是怎么样的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TangMonk

PostgresSQL 的 JSON 字段的并发控制是怎么样的?

  •  
  •   TangMonk 2016 年 5 月 13 日 3001 次点击
    这是一个创建于 3634 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果 json 中存储了一些商品的核销属性,如下:

    { "products": [ { "id": 1, "verify_status": "unverified" }, { "id": 2, "verify_status": "unverified" } ] } 

    这时,如果有两个商品核销人员,同时核销商品 1,和商品 2 , verify_status 的字段都会变成 verified 吗?还是只变一个?

    18 条回复    2016-05-14 21:40:19 +08:00
    tabris17
        1
    tabris17  
       2016 年 5 月 13 日
    你觉得同时,其实分了先后
    TangMonk
        2
    TangMonk  
    OP
       2016 年 5 月 13 日
    @tabris17

    看了 Heroku 的文档 https://devcenter.heroku.com/articles/postgresql-concurrency

    貌似是先等上一个 commit 操作完成之后再执行下一个操作,
    goofansu
        3
    goofansu  
       2016 年 5 月 13 日 via iPhone
    最近也在用, lz 是不是开发微信号
    TangMonk
        4
    TangMonk  
    OP
       2016 年 5 月 13 日
    @goofansu 你怎么知道我再开发微信。。。
    lightening
        5
    lightening  
       2016 年 5 月 13 日
    JSON 字段是只能整体写入的吧?
    TangMonk
        6
    TangMonk  
    OP
       2016 年 5 月 13 日
    @lightening 对,所以就会有这种并发问题。。
    TangMonk
        7
    TangMonk  
    OP
       2016 年 5 月 13 日
    @TangMonk PostgresSQL 9.5 可以单个键值更新了, 但是阿里云的 PostgreSQL RDS 还不支持
    goofansu
        8
    goofansu  
       2016 年 5 月 13 日 via iPhone
    @TangMonk 我还知道你用 rails
    TangMonk
        9
    TangMonk  
    OP
       2016 年 5 月 13 日
    @goofansu github 泄露了我的信息。。
    goofansu
        10
    goofansu  
       2016 年 5 月 13 日 via iPhone
    @TangMonk 就 rails 默认推荐 postgresql ,哈哈,我也在做微信号
    TangMonk
        11
    TangMonk  
    OP
       2016 年 5 月 13 日
    @goofansu 握爪
    goofansu
        12
    goofansu  
       2016 年 5 月 13 日 via iPhone
    @TangMonk 握爪,加个 qq 吧,开发遇到过好多坑

    15451124
    TangMonk
        13
    TangMonk  
    OP
       2016 年 5 月 13 日
    @goofansu 加了
    goofansu
        14
    goofansu  
       2016 年 5 月 13 日 via iPhone
    @TangMonk 我错了。 154561124
    dishonest
        15
    dishonest  
       2016 年 5 月 13 日
    @goofansu django 默认也是推荐 pg 。。
    goofansu
        16
    goofansu  
       2016 年 5 月 13 日
    @dishonest 哈哈,我不知道,多谢
    lightening
        17
    lightening  
       2016 年 5 月 14 日   1
    @TangMonk 那你看一下 PG 的 transaction isolation: http://www.postgresql.org/docs/9.4/static/transaction-iso.html

    因为 PG 的 MVCC 做的比 MySQL 好,很多情况下就不需要手工使用乐观锁了。在这四种(其实只有三种) isolation level 中选择一种合适你的。这样要注意如果有两个 transaction 同时 update 一个 json ,可能会出现第二个想 commit 发现第一个已经 commit 掉了。这时候就会触发错误,需要 app 逻辑处理重试。

    具体到 ActiveRecord ,
    begin
    ActiveRecord::Base.transaction(isolation_level: :repeatable_read) do
    # 写入数据
    end
    rescue ActiveRecord::TransactionIsolationError
    # 写入冲突,需要重试
    end


    当然你也可以用悲观锁。看你预估的冲突可能性了。 https://ruby-china.org/topics/28963 注意这篇文章里的乐观锁,如果你用 PG 的话用 PG 的 isolation level 就可以了,不需要靠 Rails 的实现。
    TangMonk
        18
    TangMonk  
    OP
       2016 年 5 月 14 日 via Android
    @lightening 多谢,我看下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2914 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 13:36 PVG 21:36 LAX 06:36 JFK 09:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86