我希望数据库行中有写锁,这样就不允许另一个事务(来自集群环境中的任何pod(修改该行。我在集群环境中遇到了问题,我们有3个应用程序pod。尝试使用@Lock(LockModeType.PESSIMISTIC_WRITE(,但无法正常工作。findById不会锁定行并向所有实例返回相同的实体
示例代码为:
@Transactional
public boolean updateLicenseCount(String serviceId, String tenantId){
LicenseCountId licenseCountId = new LicenseCountId(tenantId, serviceId);
Optional<LicenseCountEntity> licenseCountEntity = springJpaLicenseCountRepository.findById(licenseCountId);
//Perform some operaion on licenseCountEntity
//save the licenseCountEntity
}
//This is what I have in springJpaLicenseCountRepository
@Lock(LockModeType.PESSIMISTIC_WRITE)
public Optional<LicenseCountEntity> findById(LicenseCountId licenseCountId);
如果在更新一行时没有提交流程,那么其他事务将能够更新该行。如果要在执行更新之前锁定行,可以使用select ... for update
进行锁定。你不能阻止其他会议阅读这一行,坦率地说,这也没有意义例如:
select * from users where user_id = 5 for update
在这个命令之后,所以在这个选择之后,另一个事务永远不能在更新之前更新此行;更新此行后,此行将被解锁。
当我们需要读取一行时,会使用FOR SHARE
模式,但不允许其他事务更改它。FOR KEY SHARE
模式允许更改一行,但仅限于非关键字段。特别是,PostgreSQL在检查外键时会自动使用这种模式。