Java 为什么在使用同一AWS Lambda函数的多触发器将数据从Mysql迁移到S3时数据会重复

Java 为什么在使用同一AWS Lambda函数的多触发器将数据从Mysql迁移到S3时数据会重复,java,mysql,amazon-web-services,spring-boot,aws-lambda,Java,Mysql,Amazon Web Services,Spring Boot,Aws Lambda,我在AWS Lambda中使用Springboot定期将数据从MySQL DB迁移到S3。 我的lambda调用我在AWS lambda控制台的环境变量FUNCTION_NAME中设置的函数apply() 当我使用cloudwatch事件调度器的一个触发器调用lambda时,它工作正常 但是为了实现并发性并更快地完成任务,因为prod上会有数百万条记录,我同时添加了三个触发器,但是由于这个原因,存在一个问题,相同的数据被移动到s3三次,每个lambda移动一次 尽管我已经用@Transactio

我在AWS Lambda中使用Springboot定期将数据从MySQL DB迁移到S3。 我的lambda调用我在AWS lambda控制台的环境变量FUNCTION_NAME中设置的函数apply()

当我使用cloudwatch事件调度器的一个触发器调用lambda时,它工作正常

但是为了实现并发性并更快地完成任务,因为prod上会有数百万条记录,我同时添加了三个触发器,但是由于这个原因,存在一个问题,相同的数据被移动到s3三次,每个lambda移动一次

尽管我已经用@Transactional注释了我的apply()方法。下面是java.util.Function的函数接口被重写的apply()方法

@Transactional
@Override
public String apply(Map map) {
Supplier<Stream<Object>> streamSupplier = () -> repo.getAllRecords();
        try (Stream<Object> responseStream = streamSupplier.get()) {
            List<Object> dataList = new LinkedList<>();
            responseStream.forEach(item -> {
                if(dataList.size() != 30000) {
                    dataList.add(item);
                } else {
                    uploadToS3(dataList);
                    dataList.clear();
                }
                entityManager.detach(item);
            });

       if(dataList.size() > 0) {
            uploadToS3(dataList);
            dataList.clear();
        }
    }
@Transactional
@凌驾
公共字符串应用(映射){
供应商流供应商=()->repo.getAllRecords();
try(Stream responseStream=streamSupplier.get()){
List dataList=新建LinkedList();
响应团队forEach(项目->{
如果(dataList.size()!=30000){
数据列表。添加(项);
}否则{
上传至3(数据列表);
dataList.clear();
}
实体管理器分离(项目);
});
如果(dataList.size()>0){
上传至3(数据列表);
dataList.clear();
}
}
这就是我从数据库中获取结果的方式

@Transactional
@QueryHints(value = {
            @QueryHint(name = HINT_FETCH_SIZE, value = "10000"),
            @QueryHint(name = HINT_CACHEABLE, value = "false"),
            @QueryHint(name = READ_ONLY, value = "true")
    })
    @Query(value = "select * from table_x",nativeQuery = true)
    public Stream<Object> getAllRecords();
@Transactional
@查询点(值={
@QueryHint(name=HINT\u FETCH\u SIZE,value=“10000”),
@QueryHint(name=HINT\u CACHEABLE,value=“false”),
@QueryHint(name=READ\u ONLY,value=“true”)
})
@查询(value=“select*from table_x”,nativeQuery=true)
公共流getAllRecords();

我是这个领域的新手。请帮助我理解为什么即使使用事务性的数据也要迁移三次?

lambda-wise逻辑分离的逻辑在哪里,比如来自数据库的记录块/分区?lambda的某个静态lambda标识符传递给每个lambda事件,然后根据该标识符获取记录。例如.lambda Execution1将获取分区1/chunk1记录,lambda Execution2将获取分区2/chunk2记录,lambda Execution3将获取分区3/chunk3记录。我没有按照您的建议进行操作。但是,您能否告诉我为什么会发生上述情况,即每个lambda分别处理所有记录,以及为什么事务处理不起作用?您期望
@Transactional
做什么?这种期望是否与文档中所说的相符?我希望当一个lambda从DB读取一些记录时,直到它不上传到s3为止,其他lambda都不应该看到它。