【问题标题】:Is it possible multiple connections per one transaction in Postgres? Golang usagePostgres 中的每个事务是否可以有多个连接? Golang 用法
【发布时间】:2016-11-08 14:56:34
【问题描述】:

我需要使用多个连接同时在 Postgres 中填充表,但在单个事务的范围内。有可能吗?

我看不出有什么办法可以避免这个瓶颈。

谢谢

【问题讨论】:

  • 我认为不可能通过不同的连接共享事务。请更好地解释您想要做什么,也许添加一个示例以便于理解。
  • 我有一个 golang 命令,它解析一组 csv 文件并在数据库中填充适当的表。这些文件很大。 Parser 逐行读取文件并将它们放入通道。四个 goroutine 从一个通道中获取这些结果并执行 Exec()。如果我做 db.Exec() 整个过程需要 25 分钟,如果 tx.Exec() 超过 4 小时。
  • 此外,我不能在不同的事务中处理不同的文件,因为处理当前文件必须看到以前文件所做的更改。 (Postgres 不支持 READ UNCOMMITED)因此整个过程我只能使用一个连接。

标签: postgresql go transactions


【解决方案1】:

我相信交易不需要。

但如果非常想 - 你可以制作一个临时表,用几个例程填充它,然后在事务中使用这种“从选择插入”来批量传输数据

【讨论】:

  • 谢谢。我也想过。但是为什么你认为交易不需要呢?根据要求,如果过程在某些时候失败,我们应该在以前的条件下获取数据库。
  • 我假设你对下载的数据不是在业务逻辑层,或者在阶段表中执行必要的检查,然后在事务之外加载它们。在任何情况下,长时间运行大量数据的事务都会导致 DBMS 性能下降。
  • 您可以尝试使用绝缘水平。 1. 选择所需的连接数(线程数)。将它们设置为隔离级别“Read uncommitted”link 以查看其他线程中所做的更改 2. 在每个线程中启动一个事务 3. 当线程完成加载数据时,它必须等待其他线程并且没有提交事务 4. 当所有线程完成时 - 在所有线程上执行提交。在一个线程回滚更改到所有线程中的 SQL 错误的情况下。
猜你喜欢
  • 2016-08-22
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 2017-10-05
  • 2021-12-26
  • 2017-02-18
相关资源
最近更新 更多