我正在使用带有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注释应该适用于我吗?我可以添加一个触发器。有更顺畅的方式吗? 非常感谢!
答案 0 :(得分:0)
与@Transactional
一起,您需要某种行锁定机制来保证您的交易不会发生冲突。
如果您正在使用hibernate,可以使用带@Version
注释的乐观锁定,这对于Read Less Write Less场景非常理想。
如果您的写入不仅仅是读取,那么您必须使用Pesimistic锁定机制。
请阅读此帖子了解more信息