ruby - 两个进程同时在数据库中保存一条记录

标签 ruby database database-design data-storage

当多个用户同时向数据库(MySQL、Postgres)中插入数据时会发生什么情况?它如何确定先插入哪条记录和后插入哪条记录的优先级。如果答案特定于程序的应用程序,我会引用网络应用程序。

最佳答案

一般来说,两件事永远不会完全同时发生。有一个工作队列,在某种程度上,一件事总是先于另一件事发生。

但是,在某些情况下,整个事务可能需要多个步骤——如果其中两种事务几乎同时开始,它们可能会在时间上重叠。这可能会导致问题。

例如,想象一个人在购物车中购买东西,步骤包括为他们创建订单记录以及递减和库存盘点。如果两个人几乎同时开始这个过程,他们都可能在库存减少以显示商品缺货之前购买该商品。

在这种情况可能发生的情况下,postgres(和其他现代数据库)提供了限制程序保护自己的方法。这些包括交易锁定

交易 (see postgres docs here) ,语句组作为一个单元运行——如果后面的步骤之一失败,所有步骤都将“回滚”。 (例如,如果由于商品现在缺货而无法减少库存,则可以回滚订单创建。)

锁定 (see postgres docs here) ,表(甚至表中的单个行)被锁定,以便任何其他想要访问它们的进程等待或超时。这将防止两个进程几乎同时更新相同的数据。

一般来说,绝大多数应用程序不需要这两种方法中的任何一种。除非您在银行等涉及的表格包含金融交易的环境中工作,否则您可能不必担心。

关于ruby - 两个进程同时在数据库中保存一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10447030/

相关文章:

sql - Oracle SUM 返回错误的摘要,其中包含从 SELECT UNION 返回的相同值

更新json的数据库函数

database - 提升连接池?

mysql - 如何一次性将 Collat​​ion 更改为 utf8_bin

ruby - 如何在我的 C 扩展中隐藏 Ruby 层的实例变量?

ruby - 在生成 gem 时,在 gemspec 中签名 Ruby gem : Would s. signing_key 是否被删除?

ruby - 为什么将哈希集更新为变量会更新该变量?

ruby - 如何在.html.erb 文件中调用余弦和正弦函数?

mysql - 设计一个数据库来处理产品变化的库存跟踪

mysql - 动态规范化一个表是否可行?