通过连接池线程进行的多线程数据库事务是否安全?

时间:2019-03-10 07:35:33

标签: java multithreading postgresql thread-safety connection-pooling

示例场景:

在Java中使用线程池,其中每个线程都从connectionpool获取新的连接,然后所有线程继续并行执行一些db事务。例如,在同一张表中插入100个值。

这会以某种方式弄乱表/数据库还是在线程之间不需要任何同步的情况下完全安全?


我发现很难找到有关此主题的可靠信息。从我收集的数据来看,数据库引擎可以自己(如果有的话)进行处理(PostgresQL显然是从9.X版本开始的)。有没有写得好的文章进一步解释这一点?

奖金问题:当数据库在单个硬盘上运行时,甚至还有一点要利用并行事务吗?

1 个答案:

答案 0 :(得分:1)

只要数据库本身符合ACID,就可以了(尽管有时会在某些非常奇怪的情况下发现错误)。

另一个问题是:对于PostgreSQL来说,只要您有时间收集并发事务(增加commit_delay的值)就完全有意义,然后这可以帮助将磁盘I / O组合成批。还有其他一些参数可以用于事务吞吐量调整,如果 D 耐久性是您主要关注的问题之一,那么其中的大多数参数将非常危险。

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