diff --git a/app/src/main/java/com/techcourse/service/TxUserService.java b/app/src/main/java/com/techcourse/service/TxUserService.java index 082b17685d..833c01224c 100644 --- a/app/src/main/java/com/techcourse/service/TxUserService.java +++ b/app/src/main/java/com/techcourse/service/TxUserService.java @@ -1,14 +1,14 @@ package com.techcourse.service; import com.techcourse.domain.User; -import org.springframework.transaction.support.TransactionExecutor; +import org.springframework.transaction.support.JdbcTransactionManager; import org.springframework.transaction.support.TransactionManager; import javax.sql.DataSource; public class TxUserService implements UserService { - private final TransactionManager transactionManager = new TransactionExecutor(); + private final TransactionManager transactionManager = new JdbcTransactionManager(); private final DataSource dataSource; private final UserService userService; @@ -19,22 +19,17 @@ public TxUserService(DataSource dataSource, UserService userService) { @Override public User findById(long id) { - return transactionManager.execute(dataSource, () -> userService.findById(id)); + return transactionManager.executeAndReturn(dataSource, () -> userService.findById(id)); } @Override public void insert(User user) { - transactionManager.execute(dataSource, () -> { - userService.insert(user); - return null; - }); + transactionManager.execute(dataSource, () -> userService.insert(user)); } @Override public void changePassword(long id, String newPassword, String createBy) { - transactionManager.execute(dataSource, () -> { - userService.changePassword(id, newPassword, createBy); - return null; - }); + transactionManager.execute(dataSource, () -> userService.changePassword(id, newPassword, createBy) + ); } } diff --git a/jdbc/src/main/java/org/springframework/transaction/support/JdbcTransactionManager.java b/jdbc/src/main/java/org/springframework/transaction/support/JdbcTransactionManager.java new file mode 100644 index 0000000000..fd1de9d997 --- /dev/null +++ b/jdbc/src/main/java/org/springframework/transaction/support/JdbcTransactionManager.java @@ -0,0 +1,55 @@ +package org.springframework.transaction.support; + +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.datasource.DataSourceUtils; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; + +public class JdbcTransactionManager implements TransactionManager { + + @Override + public void execute(DataSource dataSource, TransactionExecutor method) { + final var connection = TransactionManager.getConnection(dataSource); + try { + connection.setAutoCommit(false); + method.execute(); + connection.commit(); + } catch (RuntimeException | SQLException e) { + handleTransactionException(connection, e); + } finally { + cleanUpTransaction(dataSource, connection); + } + } + + @Override + public T executeAndReturn(DataSource dataSource, TransactionSupplier method) { + final var connection = TransactionManager.getConnection(dataSource); + try { + connection.setAutoCommit(false); + T result = method.get(); + connection.commit(); + return result; + } catch (RuntimeException | SQLException e) { + handleTransactionException(connection, e); + return null; + } finally { + cleanUpTransaction(dataSource, connection); + } + } + + private static void handleTransactionException(Connection connection, Exception e) { + try { + connection.rollback(); + throw new DataAccessException(e); + } catch (SQLException rollbackException) { + throw new RuntimeException(rollbackException); + } + } + + private void cleanUpTransaction(DataSource dataSource, Connection connection) { + DataSourceUtils.releaseConnection(connection, dataSource); + TransactionSynchronizationManager.unbindResource(dataSource); + } +} diff --git a/jdbc/src/main/java/org/springframework/transaction/support/TransactionExecutor.java b/jdbc/src/main/java/org/springframework/transaction/support/TransactionExecutor.java index 776a1974c1..ae84933bdc 100644 --- a/jdbc/src/main/java/org/springframework/transaction/support/TransactionExecutor.java +++ b/jdbc/src/main/java/org/springframework/transaction/support/TransactionExecutor.java @@ -1,32 +1,6 @@ package org.springframework.transaction.support; -import org.springframework.dao.DataAccessException; -import org.springframework.jdbc.datasource.DataSourceUtils; - -import javax.sql.DataSource; -import java.sql.SQLException; -import java.util.function.Supplier; - -public class TransactionExecutor implements TransactionManager { - - @Override - public T execute(DataSource dataSource, Supplier method) { - final var connection = TransactionManager.getConnection(dataSource); - try { - connection.setAutoCommit(false); - T result = method.get(); - connection.commit(); - return result; - } catch (RuntimeException | SQLException e) { - try { - connection.rollback(); - throw new DataAccessException(e); - } catch (SQLException rollbackException) { - throw new RuntimeException(rollbackException); - } - } finally { - DataSourceUtils.releaseConnection(connection, dataSource); - TransactionSynchronizationManager.unbindResource(dataSource); - } - } +@FunctionalInterface +public interface TransactionExecutor { + void execute(); } diff --git a/jdbc/src/main/java/org/springframework/transaction/support/TransactionManager.java b/jdbc/src/main/java/org/springframework/transaction/support/TransactionManager.java index 8091850a7d..ae74cdabef 100644 --- a/jdbc/src/main/java/org/springframework/transaction/support/TransactionManager.java +++ b/jdbc/src/main/java/org/springframework/transaction/support/TransactionManager.java @@ -4,7 +4,6 @@ import javax.sql.DataSource; import java.sql.Connection; -import java.util.function.Supplier; public interface TransactionManager { @@ -12,5 +11,7 @@ static Connection getConnection(DataSource dataSource) { return DataSourceUtils.getConnection(dataSource); } - T execute(DataSource dataSource, Supplier method); + void execute(DataSource dataSource, TransactionExecutor method); + + T executeAndReturn(DataSource dataSource, TransactionSupplier method); } diff --git a/jdbc/src/main/java/org/springframework/transaction/support/TransactionSupplier.java b/jdbc/src/main/java/org/springframework/transaction/support/TransactionSupplier.java new file mode 100644 index 0000000000..67705e04fd --- /dev/null +++ b/jdbc/src/main/java/org/springframework/transaction/support/TransactionSupplier.java @@ -0,0 +1,6 @@ +package org.springframework.transaction.support; + +@FunctionalInterface +public interface TransactionSupplier { + T get(); +}