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

2016-05-13 16:41:40 +08:00
 TangMonk

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

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

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

2626 次点击
所在节点    PostgreSQL
18 条回复
tabris17
2016-05-13 16:42:49 +08:00
你觉得同时,其实分了先后
TangMonk
2016-05-13 16:51:39 +08:00
@tabris17

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

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

15451124
TangMonk
2016-05-13 21:54:26 +08:00
@goofansu 加了
goofansu
2016-05-13 22:05:16 +08:00
@TangMonk 我错了。 154561124
dishonest
2016-05-13 22:50:46 +08:00
@goofansu django 默认也是推荐 pg 。。
goofansu
2016-05-13 23:29:41 +08:00
@dishonest 哈哈,我不知道,多谢
lightening
2016-05-14 18:25:06 +08:00
@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
2016-05-14 21:40:19 +08:00
@lightening 多谢,我看下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/278476

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX