当多个用户同时向数据库(MySQL、Postgres)中插入数据时会发生什么情况?它如何确定先插入哪条记录和后插入哪条记录的优先级。如果答案特定于程序的应用程序,我会引用网络应用程序。
最佳答案
一般来说,两件事永远不会完全同时发生。有一个工作队列,在某种程度上,一件事总是先于另一件事发生。
但是,在某些情况下,整个事务可能需要多个步骤——如果其中两种事务几乎同时开始,它们可能会在时间上重叠。这可能会导致问题。
例如,想象一个人在购物车中购买东西,步骤包括为他们创建订单记录以及递减和库存盘点。如果两个人几乎同时开始这个过程,他们都可能在库存减少以显示商品缺货之前购买该商品。
在这种情况可能发生的情况下,postgres(和其他现代数据库)提供了限制程序保护自己的方法。这些包括交易和锁定。
与交易 (see postgres docs here) ,语句组作为一个单元运行——如果后面的步骤之一失败,所有步骤都将“回滚”。 (例如,如果由于商品现在缺货而无法减少库存,则可以回滚订单创建。)
带锁定 (see postgres docs here) ,表(甚至表中的单个行)被锁定,以便任何其他想要访问它们的进程等待或超时。这将防止两个进程几乎同时更新相同的数据。
一般来说,绝大多数应用程序不需要这两种方法中的任何一种。除非您在银行等涉及的表格包含金融交易的环境中工作,否则您可能不必担心。
关于ruby - 两个进程同时在数据库中保存一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10447030/