После нескольких дней, проведенных для расследования вопроса, я решил представить этот вопрос, потому что нет никакого смысла в том, что происходит.
Дело
Мой компьютер настроен с локальной базой данных Oracle Express. У меня есть проект JAVA с несколькими JUnit Tests, которые расширяют родительский класс (я знаю, что это не "лучшая практика" ), которая открывает соединение OJDBC (используя статический пул соединений Hikari из 10 подключений) в методе @Before и свернута Верните его в @After.
public class BaseLocalRollbackableConnectorTest {
private static Logger logger = LoggerFactory.getLogger(BaseLocalRollbackableConnectorTest.class);
protected Connection connection;
@Before
public void setup() throws SQLException{
logger.debug("Getting connection and setting autocommit to FALSE");
connection = StaticConnectionPool.getPooledConnection();
}
@After
public void teardown() throws SQLException{
logger.debug("Rollback connection");
connection.rollback();
logger.debug("Close connection");
connection.close();
}
StacicConnectionPool
public class StaticConnectionPool {
private static HikariDataSource ds;
private static final Logger log = LoggerFactory.getLogger(StaticConnectionPool.class);
public static Connection getPooledConnection() throws SQLException {
if (ds == null) {
log.debug("Initializing ConnectionPool");
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(10);
config.setDataSourceClassName("oracle.jdbc.pool.OracleDataSource");
config.addDataSourceProperty("url", "jdbc:oracle:thin:@localhost:1521:XE");
config.addDataSourceProperty("user", "MyUser");
config.addDataSourceProperty("password", "MyPsw");
config.setAutoCommit(false);
ds = new HikariDataSource(config);
}
return ds.getConnection();
}
}
Этот проект содержит сотни тестов (не параллельно), которые используют это соединение (на локальном хосте) для выполнения запросов (вставка/обновление и выбор) с использованием Sql2o, но транзакция и соединение соединения управляются только извне (по вышеприведенному тесту). База данных полностью пуста, чтобы иметь тесты ACID.
Таким образом, ожидаемый результат - вставить что-то в БД, сделать утверждения, а затем откат. таким образом, второй тест не найдет данных, добавленных предыдущим тестом, чтобы поддерживать уровень изоляции.
Проблема Выполнение всех тестов вместе (последовательно), в 90% случаев они работают правильно. 10% один или два теста, случайным образом, терпят неудачу, поскольку в базе данных (например, дублируются уникальные данные) есть грязные данные (например, дублированные). просмотр журналов, откаты предыдущих тестов были выполнены правильно. На самом деле, если я проверю базу данных, она пуста) Если я буду выполнять эти тесты на сервере с более высокой производительностью, но тот же JDK, такой же Oracle DB XE, этот коэффициент отказа увеличен до 50%.
Это очень странно, и я понятия не имею, потому что соединения разные между тестами, и откатывается каждый раз. Уровень изоляции JDBC READ COMMITTED, поэтому, даже если мы использовали одно и то же соединение, это не должно создавать никаких проблем даже при использовании одного и того же соединения. Поэтому мой вопрос: Почему это происходит? у тебя есть идеи? Является ли откат JDBC синхронным, как я знаю, или могут быть некоторые случаи, когда он может продвигаться вперед, хотя он не полностью завершен?
Это мои основные параметры базы данных: процессы 100 сессии 172 сделки 189