Получение “com.mysql.jdbc.исключения.jdbc4.MySQLTransactionRollbackException: Обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию”

#java #mysql #deadlock

Вопрос:

Когда я вставляю свои данные в базу данных mysql в пиковое время, получая com.mysql.jdbc.исключения.jdbc4.MySQLTransactionRollbackException: Обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию

при этом я приложил свой образец кода

общедоступная статическая пустая история insertPurchaseHistory(SessionHandler s, статус int) вызывает исключение {

     PreparedStatement ps = null;
    Connection con = null;
    boolean isException = false;

    String SerialNumbers = s.getSerialNumbers().replace("[", "");
    SerialNumbers = SerialNumbers.replace("]", "");
    String[] serials = SerialNumbers.split(",");

    for (String ticket : serials) {

        try {

            con = DBPool.getConnection();
            String query = "INSERT INTO DLB_SWT_ST_PURCHASE_HISTORY "   "(WALLET_ID, SERIAL_NO, MID, "
                      "TID, TXN_ID, DRAW_NO, "   "PRODUCT_CODE, STATUS, LOTTERY_NUMBERS, "
                      "SHA_KEY, SCHEDULE_ID, DRAW_DATE) "   "SELECT "   "t.WALLET_ID, t.SERIAL_NUMBER, t.MID, "
                      "t.TID, ?, t.DRAW_NO, "   "t.PRODUCT_CODE, ?, t.LOTTERY_NUMBERS, "
                      "SHA2(CONCAT(SERIAL_NUMBER, 'amp;0amp;', LOTTERY_NUMBERS),256), ?, t.DRAW_DATE "
                      "FROM DLB_WB_TICKET AS t WHERE t.ID = ?";

            if (InitConfigValues.LOG_SQL) {
                ps = new LoggablePreparedStatement(con, query);
            } else {
                ps = con.prepareStatement(query);
            }
            ps.setString(1, s.getSessionId());
            ps.setInt(2, status);
            ps.setString(3, s.getSchId());
            ps.setString(4, ticket.trim());

            ps.execute();
            if (InitConfigValues.LOG_SQL) {
                ((LoggablePreparedStatement) ps).printQueryString();
            }
        }  
        catch (Exception e) {

            isException = true;
            throw e;

        }finally {

            if (ps != null)
                ps.close();
            ps = null;

            if (isException) {
                con.rollback();
            } else {
                con.commit();
            }
            if (con != null)
                DBPool.releaseConnectionToPool(con);

        }

    }

}