Правильно очистить базу данных SQL - PullRequest
0 голосов
/ 15 апреля 2020

Я создал среду тестирования автоматизации, которая для работы требует сотен записей в базе данных SQL (используя Hibernate), теперь каждый раз, когда я создаю новую сущность / запись, я храню идентификаторы этих сущностей, чтобы я мог использовать эти идентификаторы для создания запроса DELETE для удаления всех записей, когда они не нужны (для очистки после сценария ios)

Так выглядит мой сценарий очистки базы данных (упрощенно)

private void cleanDB()
{
    Session session = sessionFactory.openSession();
    session.beginTransaction();

    try
    {
        String combinedQuery = "-- DB cleanup query\n";

        // disable constraints for each table in DB
        combinedQuery += Queries.createSetTablesConstraintEnabledQuery(false);

        // repeat this step for each table, adding DELETE statement like this
        combinedQuery += "DELETE FROM dbo.TableName WHERE (Id IN (" + ids + "))";

        // enable constraints for each table in DB
        combinedQuery += Queries.createSetTablesConstraintEnabledQuery(true);

        Query query = session.createNativeQuery(combinedQuery);
        query.executeUpdate();
        session.getTransaction().commit();
        session.close();
    }
    catch (Exception e)
    {
        closeSession(session);
        Assert.fail("Failed cleaning Client DB! " + ExceptionUtils.getStackTrace(e));
    }
} 

Теперь проблема в том, что я могу использовать несколько экземпляров моей инфраструктуры автоматизации тестирования (которые проводят тестирование на одной и той же базе данных), поэтому есть вероятность, что процедура очистки может быть выполнена одновременно, другой экземпляр - очистка базы данных, что приводит к «тупиковой блокировке». '

Причина: com.microsoft.sqlserver.jdb c .SQLServerException: Транзакция (идентификатор процесса 115) заблокирована для ресурсов блокировки с другим процессом и выбрана в качестве взаимоблокировки потерпевший. Повторите транзакцию. в com.microsoft.sqlserver.jdb c .SQLServerException.makeFromDatabaseError (SQLServerException. java: 254) в com.microsoft.sqlserver.jdb c .SQLServerStatement.getNexterestate. SQL (. 1021 *: 1608) по адресу com.microsoft.sqlserver.jdb c .SQLServerPreparedStatement.doExecutePreparedStatement (SQLServerPreparedStatement. java: 578) по адресу com.microsoft.sqlserver.jdb c. 1025 *: 508) в com.microsoft.sqlserver.jdb c .TDSCommand.execute (IOBuffer. java: 7240) в com.microsoft.sqlserver.jdb c .SQLServerConnection.executeCommand (SQLServerConnection. java : 2869) по адресу com.microsoft.sqlserver.jdb c .SQLServerStatement.executeCommand (SQLServerStatement. java: 243) по адресу com.microsoft.sqlserver.jdb c .SQLServerStatement.executeStatement (218ServerStatement * 218ServerStatement: 218 SQL Server 10). ) на com.microsoft.sqlserver.jdb c .SQLServerPreparedStatement.executeUpdate (SQLServerPreparedStatement. java: 461) at org.hibernate.engine.jdb c .internal.ResultSetReturnImpl.executeUpdate (ResultSetReturnImpl. java: 204) ... еще 64

Есть идеи, как решить эту проблему? Кто-то предложил мне не использовать транзакции при выполнении только операторов DELETE, что будет лучшим способом для очистки базы данных без ее блокировки?

...