我想编写一个非常轻量级的库方法,它将采用任意数量的 java lambda 函数,并在关闭自动提交的情况下执行它们。如果发生错误,它将回滚。因此 lambda 函数本身可以具有处理数据库更新等的代码。
我只是简单地使用函数闭包并将其传递给执行数据库逻辑的代码以使其具有事务性。寻找一种方法来泛化它,所以我要做的就是简单地传递一组 lambda 函数,并期望代码中的任何数据库更新都是事务性的。
关于如何解决这个问题有什么建议,或者我是否以正确的方式思考这个问题?
您可以在 Java 中创建一个轻量级库方法,该方法采用多个 lambda 函数,在关闭自动提交的情况下执行它们,并在发生错误时回滚,如下所示,
@FunctionalInterface
public interface TransactionalTask {
void execute() throws Exception;
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TransactionManager {
private Connection getConnection() throws SQLException {
// Replace with your actual database connection details
return DriverManager.getConnection("jdbc:database_url", "user_name", "dpassword");
}
public void executeTransaction(TransactionalTask... tasks) {
try (Connection connection = getConnection()) {
connection.setAutoCommit(false);
try {
for (TransactionalTask task : tasks) {
task.execute();
}
connection.commit();
} catch (Exception e) {
connection.rollback();
throw new RuntimeException("Transaction failed and rolled back", e);
}
} catch (SQLException e) {
throw new RuntimeException("Failed to manage transaction", e);
}
}
}
public class Main {
public static void main(String[] args) {
TransactionManager transactionManager = new TransactionManager();
transactionManager.executeTransaction(
() -> {
// Task 1: DB update logic
System.out.println("Executing task 1");
// DB update logic
},
() -> {
// Task 2: Another DB update logic
System.out.println("Executing task 2");
// DB update logic
}
// Add more tasks
);
}
}
它确保所提供的 lambda 函数内的所有数据库操作都在单个事务中执行。如果任何操作失败,事务将回滚,确保原子性。