0

你好,

我想使用 JDBC 将数据输入到具有原生 WAL 的多核系统上的数据库中。我正在考虑在我的应用程序中生成多个线程以并行插入数据。

如果应用程序有多个线程,我将不得不增加Repeatable ReadMVCC 数据库上应该映射到的隔离级别Snapshot isolation

如果我使用一个线程,我就不需要隔离级别。据我所知,大多数Snapshot isolation数据库都会分析所有可能发生冲突的事务的写入集,然后回滚除一个真正的冲突事务之外的所有事务。更具体地说,我说的是 Oracle、InnoDB 和 PostgreSQL。

1.) 这种对写集的分析是否昂贵?

2.) 多线程插入以获得更高的总吞吐量是个好主意吗?真正的冲突几乎是不可能的,因为应用层为线程提供了无冲突的东西。但是数据库应该是一个安全网。

4

2 回答 2

1

我认为这里的限制因素将是磁盘 IO,而不是移动到可重复读取的开销。

即使是单个线程也可能能够最大限度地利用数据库服务器上的磁盘,尤其是插入/更新所需的数据库日志记录量。你确定不是现在这样吗?

此外,在任何多用户系统中,您可能都希望以可重复读取隔离运行(Postgres 仅支持这一点并且可序列化)。所以,我不认为这是在我通常看到的之上添加任何“开销”。

于 2011-06-14T12:52:24.380 回答
1

Oracle 不支持可重复读取。它仅支持 Read Committed 和 Serializable。我可能弄错了,但是为 Oracle 设置可重复读取的隔离级别可能会导致事务的隔离级别为可序列化。简而言之,您只能任由数据库对所需隔离级别的支持来摆布。

我不能代表 InnoDB 和 PostgreSQL,但如果它们不支持所需的隔离级别,同样适用。数据库可以自动将隔离级别升级到更高的级别,以满足所需的隔离特性。如果您的应用程序所需的隔离级别必须是可重复读取,您应该重新考虑这种方法。

您正确推断的问题是,如果检测到冲突,乐观锁定可能会导致事务回滚。Oracle 通过报告ORA-08177SQL 错误来做到这一点。由于当两个线程将访问相同的数据范围时会报告此错误,因此如果线程处理涉及不同数据范围的数据集,则可以避免此错误。在跨线程划分工作时,您必须确保是这种情况。

于 2011-06-14T12:58:37.867 回答