
如果 json 中存储了一些商品的核销属性,如下:
{ "products": [ { "id": 1, "verify_status": "unverified" }, { "id": 2, "verify_status": "unverified" } ] } 这时,如果有两个商品核销人员,同时核销商品 1,和商品 2 , verify_status 的字段都会变成 verified 吗?还是只变一个?
1 tabris17 2016 年 5 月 13 日 你觉得同时,其实分了先后 |
2 TangMonk OP @tabris17 看了 Heroku 的文档 https://devcenter.heroku.com/articles/postgresql-concurrency 貌似是先等上一个 commit 操作完成之后再执行下一个操作, |
3 goofansu 2016 年 5 月 13 日 via iPhone 最近也在用, lz 是不是开发微信号 |
5 lightening 2016 年 5 月 13 日 JSON 字段是只能整体写入的吧? |
6 TangMonk OP @lightening 对,所以就会有这种并发问题。。 |
17 lightening 2016 年 5 月 14 日 @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 多谢,我看下 |