Spring jpa hibernate:以原子方式读写数据

时间:2015-03-04 23:43:37

标签: java spring hibernate jpa spring-transactions

我正在使用带有jpa和hibernate的spring 4,我面临以下问题:

我有一个包含以下字段的表: - ID(PK) - 提供者 - ProviderId - 状态

此表用于映射来自给定提供商的订单的工作流程。 Provider和ProviderId应该是唯一的 但我可以在错误状态下为同一个(PRovider,ProviderId)设置不同的行,而我必须在任何时刻 对于给定提供者,ProviderId最多为一行,状态为OPEN。例如,以下是正确的配置:

1,PROV,001,CANCELLED
2,PROV,001,ERROR
3,PROV,001,OPEN

虽然这个无效:

1,PROV1,002,CANCELLED
2,PROV1,002,OPEN
3,PROV1,002,OPEN

我有一个带有addORder方法的服务类,它检查对于给定的Provider,OrderID是否已经存在一行状态 在执行保存之前打开。我如何确保检查(执行选择)和db写入是原子地执行的? @Transactional注释应该适用于我吗?我可以添加一个触发器。有更顺畅的方式吗? 非常感谢!

1 个答案:

答案 0 :(得分:0)

@Transactional一起,您需要某种行锁定机制来保证您的交易不会发生冲突。

如果您正在使用hibernate,可以使用带@Version注释的乐观锁定,这对于Read Less Write Less场景非常理想。

如果您的写入不仅仅是读取,那么您必须使用Pesimistic锁定机制。

请阅读此帖子了解more信息