package com.example.demo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.support.TransactionTemplate;

import jakarta.persistence.EntityManagerFactory;

/**
 * 事务管理器配置
 * 确保事务不会长时间占用数据库连接
 */
@Configuration
@EnableTransactionManagement
public class TransactionManagerConfig {

    @Autowired
    private EntityManagerFactory entityManagerFactory;


    /**
     * 配置事务管理器
     * 使用 JpaTransactionManager 以支持 JPA 操作（包括悲观锁）
     * 注意：超时时间在 TransactionTemplate 中设置，而不是在 TransactionManager 中
     * 这样可以更精确地控制不同场景下的超时时间
     */
    @Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        
        // 设置是否允许嵌套事务
        transactionManager.setNestedTransactionAllowed(true);
        
        // 设置是否在回滚时验证事务状态
        transactionManager.setValidateExistingTransaction(true);
        
        // 注意：超时时间在 TransactionTemplate 中设置，而不是在 TransactionManager 中
        // 这样可以更精确地控制不同场景下的超时时间
        
        return transactionManager;
    }

    /**
     * 配置用于异步方法的事务模板
     * 使用更短的超时时间（3秒），确保异步线程中的事务快速完成
     */
    @Bean(name = "asyncTransactionTemplate")
    public TransactionTemplate asyncTransactionTemplate(PlatformTransactionManager transactionManager) {
        TransactionTemplate template = new TransactionTemplate(transactionManager);
        
        // 异步方法中的事务超时时间设置为3秒
        // 确保异步线程中的数据库操作快速完成，不会长时间占用连接
        template.setTimeout(3);
        
        // 设置传播行为为 REQUIRES_NEW，确保每个操作都是独立事务
        template.setPropagationBehavior(org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        
        // 设置隔离级别为 READ_COMMITTED（默认）
        template.setIsolationLevel(org.springframework.transaction.TransactionDefinition.ISOLATION_READ_COMMITTED);
        
        // 设置只读标志（默认false，允许写操作）
        template.setReadOnly(false);
        
        return template;
    }

    /**
     * 配置用于只读操作的事务模板
     * 使用更短的超时时间（2秒），确保只读操作快速完成
     */
    @Bean(name = "readOnlyTransactionTemplate")
    public TransactionTemplate readOnlyTransactionTemplate(PlatformTransactionManager transactionManager) {
        TransactionTemplate template = new TransactionTemplate(transactionManager);
        
        // 只读操作超时时间设置为2秒
        template.setTimeout(2);
        
        // 设置传播行为为 REQUIRES_NEW
        template.setPropagationBehavior(org.springframework.transaction.TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        
        // 设置只读标志为 true
        template.setReadOnly(true);
        
        return template;
    }
}

