通过连接池线程安全的多线程数据库事务吗?

Are multithreaded database transactions via connection-pooling threadsafe?

示例场景:

在 java 中使用线程池,其中每个线程从连接池获取一个新连接,然后所有线程继续并行执行一些数据库事务。例如将 100 个值插入相同的 table.

这会不会以某种方式与 table/database 混淆,或者如果线程之间不需要任何类型的同步,它是否完全安全?


我发现很难找到关于这个主题的可靠信息。据我收集的信息,数据库引擎完全在 own/if 上处理这个问题(PostgresQL 显然是从版本 9.X 开始)。是否有任何写得很好的文章进一步解释这一点?

额外问题:当数据库在单个硬盘上运行时,是否还有必要使用并行事务?

只要数据库本身符合 ACID 你就没问题(尽管偶尔有人会在一些非常奇怪的情况下发现错误)。

关于奖励问题:对于 PostgreSQL,只要您有时间收集并发事务(增加 commit_delay 的值),它就完全有意义,然后可以帮助组合磁盘 I/O分批次。还有其他用于调整事务吞吐量的参数,如果 D可用性是您主要关注的问题之一,那么其中的大部分参数可能会非常危险。

此外,请记住,数据库客户端还需要在数据库调用之间做一些工作,当顺序执行时,只会增加数据库的空闲时间。所以即使在这里,并行性也有帮助(只要你有实际的资源(CPU,...)。