我有一个PostgreSQL数据库,我收集来自4个不同生产者的报告。回到我写这篇文章的时候,我定义了4个不同的模式(每个生产者一个),因为报告结构相似,每个模式里面都有完全相同的表。我想将模式合并为一个,并将生成器ID的额外列添加到表中。
目前我正在运行4个python进程 - 每个生产者一个。进程收集报告并将其插入数据库。
我的非常简单的代码在过去的几个月中一直在运行而没有崩溃。当前的设计使得2个进程无法同时将数据插入数据库。如果我更改了数据库(单个模式与单个表),则多个进程可能希望同时插入数据。目前,我将排除将这些流程合并为一个流程,请假设我不这样做。
我不确定是否需要担心任何特殊代码来处理将数据插入数据库的多个进程的情况?我正在使用python3 + SQLAlchemy + Flask。我认为数据库的ACID属性应该自动处理2个或更多想要同时插入数据的进程(报告中的数据很小,插入时间不到1秒)。我可以在不担心进程插入冲突的情况下组合模式吗?
答案 0 :(得分:1)
如果您正在使用Postgres或MySQL等适当的数据库,这将不会成为问题。它们旨在解决这个问题。
如果您使用的是sqlite,那么它可能会中断。
答案 1 :(得分:0)
对于简单的INSERT,是的,您可以安全地让四个生产者添加行。我假设您没有长时间运行的查询,因为如果插入在一小时的JOIN期间继续发生,则一致性读取可能需要分配有意义的日志空间。
如果我插入大量数据而一个插入导致另一个插入超时?
您建议多个竞争INSERT可能会出现超时,但我不明白可能会产生什么。我不相信这是你迄今为止观察到的一个问题。读者和作者可以争夺锁,但独立的INSERTing过程是非常安全的。如果四个进程正在进行BEGIN,UPDATE 1,... UPDATE N,COMMIT,那么尊重全局订单就很重要,但是你的用例具有非常简单的优点。