【发布时间】:2017-05-18 12:52:15
【问题描述】:
我有一种情况,两个线程正在尝试检查 userId,当它没有出现时,它们会尝试创建它。问题是,userId 是 SQL 创建的,当第二个线程尝试保存它时,它已经通过了“if user == null”错误检查。
User.java 的相关部分:
@Column(name = "username", unique=true, length = 150)
private String username;
DemoApp.java:
String usrName = "testuser";
// ur is a CrudRepository from Spring Boot for Users
User existingU = ur.findOneByUsername(usrName); // Both Threads cannot find usrName
if(existingU == null){
//#thread 1 is able to save the user, but thread 2 causes "unique constraint SQL error."
existingU = new User(usrName, "firstname", "lastname");
ur.save(existingU); // Thread 1 succeeds here... Thread 2 fail
lg.info("Saved new user"); // Thread 1 outputs this.
// Thread 2 errors out on .save and crashes
} else {
lg.info("User found in database"); // this never happens
}
UserRepository(用于你的变量)
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<User, Long> {
User findOneByUsername(String userName);
}
问题:如何确保 CrudRepository findByUsername 是最新的并且不会进入现有U==null if 语句?有没有更优雅的方式来设计这种情况?也许没有解决方案,因为线程似乎在同一毫秒启动。
【问题讨论】:
标签: multithreading spring-data spring-data-jpa