想要在数据库行中写锁(Postgress),以便不允许通过另一个事务(来自任何pod)修改该行



我希望数据库行中有写锁,这样就不允许另一个事务(来自集群环境中的任何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在检查外键时会自动使用这种模式。

相关内容

最新更新