我无法使用 Spring Data JPA 在 Spring Boot 2 项目上获得乐观锁定。我有一个在不同线程中运行 2 个简单更新的测试,但它们都成功(没有乐观锁异常),并且其中一个更新被另一个覆盖。
(请看底部的编辑)
这是我的实体:
@Entity
@Table(name = "User")
public class User {
@Column(name = "UserID")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "FirstName")
@NotBlank()
private String fistName;
@Column(name = "LastName")
@NotBlank
private String lastName;
@Column(name = "Email")
@NotBlank
private String email;
@Version
@Column(name = "Version")
private long version;
// getters & setters
}
这是我的存储库:
public interface UserRepository extends JpaRepository<User, Integer> {
}
这是我的服务:
@Service
public class UserService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public User updateUser(User user)
throws UserNotFoundException {
final Optional<User> oldUserOpt = userRepository.findById(user.getId());
User oldUser = oldUserOpt
.orElseThrow(UserNotFoundException::new);
logger.debug("udpateUser(): saving user. {}", user.toString());
oldUser.setFistName(user.getFistName());
oldUser.setLastName(user.getLastName());
oldUser.setEmail(user.getEmail());
return userRepository.save(oldUser);
}
}
最后这是我的测试:
@SpringBootTest
@AutoConfigureMockMvc
@RunWith(SpringRunner.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class UserControllerIntegrationTest {
@Test
public void testConcurrentUpdate() throws Exception {
String body1 = "{\"fistName\":\"John\",\"lastName\":\"Doe\",\"email\":\"johno@gmail.com\"}";
String body2 = "{\"fistName\":\"John\",\"lastName\":\"Watkins\",\"email\":\"johno@gmail.com\"}";
}
当测试运行时,数据库中只有这条记录(使用内存中的 h2):插入用户(用户 ID,名字,姓氏,电子邮件,版本)值(1,'John','Oliver','johno@gmail. com', 1);
这些是日志。我注意到正在检查并在 sql 中设置版本,所以工作正常。事务结束时执行update语句,但两个事务都执行成功,无异常。
顺便说一句,我尝试覆盖存储库中的保存方法以添加 @Lock(LockModeType.OPTIMISTIC) 但没有任何改变。
慕斯709654
汪汪一只猫
相关分类