【问题标题】:Thread safety on spring components with couchbase带沙发底座的弹簧组件的螺纹安全性
【发布时间】:2020-07-21 21:32:47
【问题描述】:

我只有休息控制器、服务和 dao 方法和 .检查数据库中是否存在现有学生(如果存在),然后使用当前请求值更新现有对象并存储在数据库中。但是在多线程环境中,很少有记录的值会被覆盖。我的理解是每个线程都有自己的堆栈和变量,这些变量位于特定于线程的堆栈中。在这种情况下,有时不了解学生对象是如何被覆盖的。任何人都可以有任何想法,请您提供一些意见。

@RestController
public class HelloWorldController {

    @Autowired
    private StudentService service;

    @RequestMapping(value = "/student", method = RequestMethod.PUT)
    public String updateStudent(StudentDto studentDto) {
        service.updateStudent(studentDto);
        return "Success";
    }
}

...

@Service
public class StudentService {       

    @Autowired
    private StudentDao studentDao;

    public void updateStudent(StudentDto dto) {
        Student student = studentDao.findByStudentId(dto.getId());
        if (student != null) {
                student.setName(dto.getName());
               studentDao.update(student); // dao extends couchbaseReository
          } 
      
    }
}

【问题讨论】:

  • 您的服务应该是@Transactional,以便在单个事务中处理内容。如果您想防止并发写入,您需要一些悲观(数据库处理锁)或乐观(JPA 处理它)的锁定。如果有 2 个请求进入,则不加锁,值将被覆盖,最后一个获胜。
  • 感谢 M. Deinum 的回复。我正在使用 couchbase (nosql) 数据库并使用 couchbase 存储库 API。

标签: java spring multithreading spring-boot thread-safety


【解决方案1】:

我认为你可以使用:

studentDao.save(student);

而不是

studentDao.update(student);

如果你想在并行线程中处理任务,你可以使用注解 @Async (Spring)

【讨论】:

  • 感谢您的回复。但问题与多线程有关..我不需要并行任务..它的并发问题
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多