/*
 * Copyright 2010-2020 Redgate Software Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.flywaydb.core.internal.jdbc;

import org.flywaydb.core.api.FlywayException;
import org.flywaydb.core.api.logging.Log;
import org.flywaydb.core.api.logging.LogFactory;
import org.flywaydb.core.internal.exception.FlywaySqlException;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.concurrent.Callable;

Spring-like template for executing transactions.
/** * Spring-like template for executing transactions. */
public class TransactionalExecutionTemplate implements ExecutionTemplate { private static final Log LOG = LogFactory.getLog(TransactionalExecutionTemplate.class);
The connection to the database
/** * The connection to the database */
private final Connection connection;
Whether to roll back the transaction when an exception is thrown.
/** * Whether to roll back the transaction when an exception is thrown. */
private final boolean rollbackOnException;
Creates a new transaction template for this connection.
Params:
  • connection – The connection for the transaction.
  • rollbackOnException – Whether to roll back the transaction when an exception is thrown.
/** * Creates a new transaction template for this connection. * * @param connection The connection for the transaction. * @param rollbackOnException Whether to roll back the transaction when an exception is thrown. */
TransactionalExecutionTemplate(Connection connection, boolean rollbackOnException) { this.connection = connection; this.rollbackOnException = rollbackOnException; }
Executes this callback within a transaction.
Params:
  • callback – The callback to execute.
Returns:The result of the transaction code.
/** * Executes this callback within a transaction. * * @param callback The callback to execute. * @return The result of the transaction code. */
@Override public <T> T execute(Callable<T> callback) { boolean oldAutocommit = true; try { oldAutocommit = connection.getAutoCommit(); connection.setAutoCommit(false); T result = callback.call(); connection.commit(); return result; } catch (Exception e) { RuntimeException rethrow; if (e instanceof SQLException) { rethrow = new FlywaySqlException("Unable to commit transaction", (SQLException) e); } else if (e instanceof RuntimeException) { rethrow = (RuntimeException) e; } else { rethrow = new FlywayException(e); } if (rollbackOnException) { try { LOG.debug("Rolling back transaction..."); connection.rollback(); LOG.debug("Transaction rolled back"); } catch (SQLException se) { LOG.error("Unable to rollback transaction", se); } } else { try { connection.commit(); } catch (SQLException se) { LOG.error("Unable to commit transaction", se); } } throw rethrow; } finally { try { connection.setAutoCommit(oldAutocommit); } catch (SQLException e) { LOG.error("Unable to restore autocommit to original value for connection", e); } } } }