使用多核的数据库JDBC与隔离级别的开销

问题描述

| 哈o 我想使用JDBC将数据添加到具有本地WAL的多核系统上的数据库中。我正在考虑在应用程序中产生多个线程以并行插入数据。 如果应用程序有多个线程,我将不得不将隔离级别提高到“ 0”,这在MVCC数据库上应该被映射到“ 1”。 如果我使用一个线程,则不需要隔离级别。据我所知,大多数“ 1”数据库都会分析所有可能发生冲突的事务的写集,然后回滚除其中一个真正的冲突事务之外的所有事务。更具体地说,我在谈论Oracle,InnoDB和Postgresql。 1.)这种对写集的分析昂贵吗? 2.)对插入件进行多线程处理以提高总吞吐量是否是一个好主意?真正的冲突几乎是不可能的,因为向线程提供应用程序层不会产生冲突。但是数据库应该是一个安全网。     

解决方法

        Oracle不支持重复读取。它仅支持读取提交和可序列化。我可能会误会,但是为Oracle设置重复性隔离级别可能会导致事务的隔离级别为Serializable。简而言之,您只能依靠数据库对所需隔离级别的支持。 我不能代表InnoDB和PostgreSQL,但是如果它们不支持所需的隔离级别,则同样适用。数据库可以自动将隔离级别升级到更高级别,以满足所需的隔离特性。如果您的应用程序所需的隔离级别必须为“可重复读取”,则应重新考虑这种方法。 像您正确推断的那样,如果检测到冲突,乐观锁定可能会导致事务回滚。 Oracle通过报告“ 3” SQL错误来做到这一点。由于当两个线程将访问同一数据范围时将报告此错误,因此如果线程对涉及不同数据范围的数据集进行工作,则可以避免该错误。您必须确保在跨线程划分工作时是这种情况。     ,        我认为这里的限制因素将是磁盘IO,而不是转移到“可重复读取”的开销。 即使是单个线程也可能能够最大化数据库服务器上的磁盘,尤其是插入/更新所需的数据库日志记录量。您确定不是这种情况吗? 另外,在任何多用户系统中,您可能无论如何都希望使用“可重复读取”隔离来运行(Postgres仅支持此功能并且可序列化)。因此,我不认为这会在我通常会看到的上方添加任何“开销”。