Java 在Spring中使用事务进行同步
我们有一个对MySql进行读写的方法,这个方法可以被多个线程调用。数据库操作如下所示: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
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中。