并发进程可以写入共享数据库吗?

时间:2015-05-04 00:23:50

标签: python database concurrency

我使用Python多处理库生成多个进程,每个进程都写入共享(MongoDB)数据库。这是安全的,还是写入会相互覆盖?

2 个答案:

答案 0 :(得分:4)

只要确保为每个工作进程创建单独的数据库连接,让多个进程同时访问数据库是完全安全的。他们发出的任何对数据库进行更改的查询都将单独应用,通常按数据库接收的顺序进行。在大多数情况下,这将是安全的,

  • 如果您的流程只是将文档插入数据库,则每个插入通常会创建一个单独的对象。

    例外情况是,如果您为文档明确指定_id,并且该标识符已在集合中使用。这将导致插入失败。 (所以不要这样做:保留_id,MongoDB将始终为您生成一个唯一的值。)

  • 如果您的进程正在从数据库中删除文档,则如果另一个进程已删除同一对象,则操作将失败。 (但这不是严格意义上的失败;它只是意味着其他人在你之前到达那里。)

  • 如果您的进程正在更新数据库中的文档,那么事情会变得更加模糊。

    只要每个流程都在更新不同的文档,您就可以了。

    如果多个进程同时尝试更新同一文档,则需要小心。将按顺序应用替换对象上的值的更新,这可能导致一个进程所做的更改无意中被另一个进程覆盖。您应该小心避免指定您不打算更改的字段。使用MongoDB update operators可能有助于以原子方式执行复杂操作,例如更改字段的数值。

请注意"同时"并不一定意味着操作在正好同时发生。它更普遍地表示存在重叠"在两个进程使用同一文档的时候,例如

Process A                    Process B
---------                    ---------
Reads object from DB         ...
working...                   Reads object from DB
working...                   working...
updates object with changes  working...
                             updates object with changes

在上述情况下,进程A可能会因进程B无意中覆盖某些更改而被覆盖。

答案 1 :(得分:2)

简而言之,是的,让数据库担心数据库操作的并发性是完全合理的(并且实际上是首选的)。

任何相关的数据库驱动程序(包括MongoDB)都会自动为您处理并发操作。