Java 在Spring中使用事务进行同步

Java 在Spring中使用事务进行同步,java,mysql,spring,Java,Mysql,Spring,我们有一个对MySql进行读写的方法,这个方法可以被多个线程调用。数据库操作如下所示: public List<Record> getAndUpdate() { Task task = taskMapper.selectByPrimaryKey(id); if (task.getStatus() == 0) { insertRecords(); task.setStatus(1); taskMapper.update(t

我们有一个对MySql进行读写的方法,这个方法可以被多个线程调用。数据库操作如下所示:

public List<Record> getAndUpdate() {
    Task task = taskMapper.selectByPrimaryKey(id);
    if (task.getStatus() == 0) {
        insertRecords();
        task.setStatus(1);
        taskMapper.update(task);
    } 

    // some queries and return data
    return someRecordMapper.selectByXXX();
}

private void insertRecords() {
    // read some files and create someRecords
    someRecordMapper.insertBatch(someRecords);
}
public List getAndUpdate(){
Task Task=taskMapper.selectByPrimaryKey(id);
if(task.getStatus()==0){
插入记录();
任务。设置状态(1);
taskMapper.update(任务);
} 
//一些查询和返回数据
返回someRecordMapper.selectByXXX();
}
私有void insertRecords(){
//读取一些文件并创建一些记录
someRecordMapper.insertBatch(someRecords);
}
该方法读取任务的状态,如果状态为0,则将(该任务的)一组记录插入到
记录表中,然后将任务的状态设置为1

我希望这些DB操作是事务性和独占性的,这意味着当一个线程进入事务时,其他线程将尝试读取相同的数据 任务应该被阻止。否则,他们将看到任务状态为0,并且将多次调用
insertRecords()
,从而产生重复的数据

@Transactional
注释似乎不会阻止来自其他线程的事务,它只确保在中止时回滚。因此,我认为仅凭
@Transactional
,上述问题是无法避免的


我在mybatis中使用MySql,我认为MySql本身可以实现线程之间的同步,所以我尽量不引入redis lock等额外组件来实现。我不知道春天怎么做I 最后使用了
“选择…进行更新”
查询。执行此查询后,所有其他读/写操作将被锁定,直到当前事务提交或回滚。还需要使用
@Transactional
注释该方法。但是这里的行锁和事务是两个不同的关注点。测试结果令人满意。

I 最后使用了
“选择…进行更新”
查询。执行此查询后,所有其他读/写操作将被锁定,直到当前事务提交或回滚。还需要使用
@Transactional
注释该方法。但是这里的行锁和事务是两个不同的关注点。测试结果令人满意。

您尝试过使用同步块吗?@JoseLuis这是一个分布式系统,锁需要在DB中。您尝试过使用同步块吗?@JoseLuis这是一个分布式系统,锁需要在DB中。