V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TangMonk
V2EX  ›  PostgreSQL

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

  •  
  •   TangMonk · 2016-05-13 16:41:40 +08:00 · 2500 次点击
    这是一个创建于 2911 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果 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-05-13 16:42:49 +08:00
    你觉得同时,其实分了先后
    TangMonk
        2
    TangMonk  
    OP
       2016-05-13 16:51:39 +08:00
    @tabris17

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

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

    15451124
    TangMonk
        13
    TangMonk  
    OP
       2016-05-13 21:54:26 +08:00
    @goofansu 加了
    goofansu
        14
    goofansu  
       2016-05-13 22:05:16 +08:00 via iPhone
    @TangMonk 我错了。 154561124
    dishonest
        15
    dishonest  
       2016-05-13 22:50:46 +08:00
    @goofansu django 默认也是推荐 pg 。。
    goofansu
        16
    goofansu  
       2016-05-13 23:29:41 +08:00
    @dishonest 哈哈,我不知道,多谢
    lightening
        17
    lightening  
       2016-05-14 18:25:06 +08:00   ❤️ 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-05-14 21:40:19 +08:00 via Android
    @lightening 多谢,我看下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1390 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 16:47 · PVG 00:47 · LAX 09:47 · JFK 12:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.