如果 json 中存储了一些商品的核销属性,如下:
{
"products": [
{
"id": 1,
"verify_status": "unverified"
},
{
"id": 2,
"verify_status": "unverified"
}
]
}
这时,如果有两个商品核销人员,同时核销商品 1,和商品 2 , verify_status 的字段都会变成 verified
吗?还是只变一个?
1
tabris17 2016-05-13 16:42:49 +08:00
你觉得同时,其实分了先后
|
2
TangMonk OP @tabris17
看了 Heroku 的文档 https://devcenter.heroku.com/articles/postgresql-concurrency 貌似是先等上一个 commit 操作完成之后再执行下一个操作, |
3
goofansu 2016-05-13 20:41:04 +08:00 via iPhone
最近也在用, lz 是不是开发微信号
|
5
lightening 2016-05-13 20:46:31 +08:00
JSON 字段是只能整体写入的吧?
|
6
TangMonk OP @lightening 对,所以就会有这种并发问题。。
|
7
TangMonk OP @TangMonk PostgresSQL 9.5 可以单个键值更新了, 但是阿里云的 PostgreSQL RDS 还不支持
|
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 的实现。 |
18
TangMonk OP @lightening 多谢,我看下
|