在Postgres中,一个事务是否可以有多个连接?Golang的使用

3
我需要使用多个连接在单个事务的范围内同时填充Postgres表,这是否可行?
我没有看到避免此瓶颈的方法。
谢谢。

我认为不可能通过不同的连接共享事务。请更好地解释您想要做什么,最好添加一个示例以便于理解。 - Mario Santini
我有一个 Golang 命令,它解析一组 CSV 文件并将其填充到适当的数据库表中。这些文件非常大。解析器逐行读取文件并将其放入通道中。四个 goroutine 从通道中获取这些结果并执行 Exec()。如果我使用 db.Exec() 整个过程需要 25 分钟,而使用 tx.Exec() 则需要超过 4 小时。 - MasterJ
此外,我无法在不同的事务中处理不同的文件,因为当前文件的处理必须查看先前文件所做的更改。(Postgres不支持READ UNCOMMITED)因此,对于整个过程,我只能使用一个连接。 - MasterJ
1个回答

1
我相信这个事务是不必要的。但如果非要这么做,你可以创建一个临时表,在其中填充一些例程,然后通过使用“插入选择”来批量传输数据。

谢谢。我也考虑过这个问题。但是你为什么认为这个事务不需要呢? 根据要求,如果某个点的处理失败,我们应该将数据库恢复到之前的状态。 - MasterJ
我假设您在下载数据时会在业务逻辑层或阶段表中执行必要的检查,然后在事务之外加载它们。无论如何,长时间运行的事务涉及大量数据将导致DBMS性能下降。 - Андрей Николаев
  1. 您可以尝试调整隔离级别。选择所需的连接数(线程数),将它们设置为“读未提交”隔离级别[链接](https://www.postgresql.org/docs/9.6/static/transaction-iso.html),以查看在其他线程中所做的更改。
  2. 在每个线程中启动一个事务。
  3. 当线程完成数据加载时,必须等待其他线程并且不提交事务。
  4. 当所有线程都完成后,在所有线程上执行提交。
如果其中一个线程出现SQL错误,则回滚所有线程的更改。
- Андрей Николаев

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接