Как совершать транзакции на сервисном уровне

У меня есть слой DAO в моем проекте. Вот мой интерфейс UsersDao и его реализация UsersDaoImpl.

     public interface UsersDao {    
public Users insert(Users object); 
}



public class UsersDaoImpl implements UsersDao {

    @Override
    public Users insert(Users object) {

        String sqlQuery = null;
        PreparedStatement stmt = null;

        try (Connection connection = DbConnector.getConnection()) {

            sqlQuery = "INSERT INTO `users`(login, password,passwordSalt, name, surname)" + " values (?, ?,?,?,?);";

            stmt = connection.prepareStatement(sqlQuery);

            stmt.setString(1, "fsf");
            stmt.setString(2, "f");
            stmt.setString(3, "af");
            stmt.setString(4, "fddsg");
            stmt.setString(5, "sdgsgd");
            stmt.executeUpdate();
            stmt.close();
            return object;

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            return null;
        }
    }

Вот мои классы и интерфейсы слоя Service.

public interface UsersService{
public Users insert(Users object);
}

public class UsersServiceImpl implements UsersService{
UsersDaoImpl users = new UsersDaoImpl();

public Users insert(Users object){

return users.insert(object);

}

Что мне нужно написать в свой сервисный метод, чтобы я мог сделать откат при обнаружении исключения? Как правильно написать транзакцию в моем сервисном методе? Не могли бы вы показать мне несколько примеров? Спасибо!


person Serg Shapoval    schedule 04.08.2016    source источник
comment
В Java EE для этого обычно используется EJB. Доступно ли это в вашей среде? Потому что тот факт, что вы используете шаблон JDBC вместо однострочников JPA, убедительно свидетельствует о том, что вы используете базовый контейнер сервлетов, такой как Tomcat, вместо обычного сервера Java EE.   -  person BalusC    schedule 05.08.2016


Ответы (1)


Во-первых, если возникает исключение, ваш набор данных не будет вставлен, и поэтому он будет откатываться.

Вы используете транзакции, если у вас есть отдельные атомарные операции, которые связаны между собой. Это означает, что если одна ошибка вам нужно откатиться. Если вы сейчас хотите реализовать это вручную, вам придется посмотреть, что вы сделали для точки X, а затем отменить все, что произошло. Но он очень подвержен ошибкам и очень негибок. Поэтому я рекомендую для этой цели использовать базовую систему баз данных, в которую будет интегрирована эта функциональность. Или используйте персистентный слой.

Если вы используете совместимый с JDBC драйвер, посмотрите здесь https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

person sascha10000    schedule 04.08.2016
comment
Просто как побочный вопрос. Я надеюсь, вы не будете хранить свои пароли в открытом виде? - person sascha10000; 05.08.2016