Posts

Spring 内部调用,事务真会失效吗?

Spring 事务失效问题深入分析:非代理内部调用 先说结论。非Spring代理的内部调用,事务本身不会失效。但 @Transactional 注解会因为代理失效而失效。 代码示例 同一个类 TransactionUserService 中。 @Transactional public void a() { userMapper.insert("A"); b(); throw new RuntimeException("触发回滚"); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void b() { userMapper.insert("B"); } 结果:A、B记录均回滚。 你的预期是否是:A 回滚,B 提交? 如果是。此时你应该在思考, b() 的事务已失效,为什么 b() 还会被回滚?但其实此时 b() 的事务并未失效,失效的只是 @Transactional(propagation = Propagation.REQUIRES_NEW) 注解本身。我们接着往下验证。 通过事务信息验证 在 a() 和 b() 中使用 TransactionSynchronizationManager.*getResourceMap*() 打印事务信息: // a() 中打印 System.out.println(TransactionSynchronizationManager.getResourceMap()); // b() 中打印 System.out.println(TransactionSynchronizationManager.getResourceMap()); 打印结果: a() 事务信息 {{ CreateTime:"2025-02-14 14:10:00", ActiveCount:1, PoolingCount:0, CreateCount:1, DestroyCount:0, CloseCount:0, ConnectCount:1, ...

CompletableFuture 异常处理实践:避免线程池耗尽

想象一个场景。假设我们有一个电商平台,需要异步处理大量的订单数据。我们可以使用 CompletableFuture 来实现异步处理,并提高并发效率。 CompletableFuture 简介 CompletableFuture 是 Java 8 引入的异步编程工具,它可以简化异步任务的处理。CompletableFuture 提供了多种方法来处理任务的完成和异常情况。 思考:以下代码会正常执行吗? main 函数 Java public static void main (String[] args) throws ExecutionException, InterruptedException, TimeoutException { // 创建线程池 ThreadPoolExec utor executorService = new ThreadPoolExecutor( 4 , 4 , 20 , TimeUnit.SECONDS, new LinkedBlockingQueue<>()); // 循环执行 task 函数 for ( int i = 0 ; i < 10 ; i++) { task(executorService); System.out.println( "------------------------------" ); } } 创建一个固定大小的线程池,用于执行异步任务。 使用 for 循环10次执行 task 函数,模拟异步处理订单数据。 task 函数 Java public static void task (ThreadPoolExecutor executorService) { // 打印线程池中正在执行任务的线程数量 System.out.println( "Active Threads: " + executorService.getActiveCount()); List<CompletableFuture<Integer>> futures = new ...