【发布时间】: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