【问题标题】:Spring jpa hibernate: read and write data in atomic waySpring jpa hibernate:以原子方式读写数据
【发布时间】:2015-03-04 23:43:36
【问题描述】:

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

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

此表用于映射来自给定提供商的订单的工作流程。 Provider 和 ProviderId 应该是唯一的 但是我可以在错误状态下对相同的(PRvider,ProviderId)有不同的行,而我必须在任何时候 对于给定的 Provider,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 是否已经存在状态中的一行 在执行保存之前打开。我如何确定检查(执行选择)和数据库写入是原子执行的? @Transactional 注释应该对我有用吗?我可以添加一个触发器。有更流畅的方法吗? 多谢!

【问题讨论】:

    标签: java spring hibernate jpa spring-transactions


    【解决方案1】:

    除了@Transactional,您还需要某种行锁定机制来保证您的事务不会发生冲突。

    如果您使用的是休眠,可以使用带有@Version 注释的乐观锁定,这对于经常读写的场景来说是理想的选择。

    如果您的写入多于读取,那么您必须使用悲观锁定机制。

    请阅读这篇文章以获取more的信息

    【讨论】:

    • 谢谢@shazin,我不确定锁。我没有要锁定的行。考虑以下场景。为给定的提供者和提供者 ID 执行两个并发添加,假设我有两个线程执行此活动:- T1 check for rows in OPEN status for the given request, none is found - T2 performs the same check, no rows is found - T1 writes the new row for the given input in status OPEN - T2 writes the same row 在这种情况下,如果我要添加不存在的行,则很难应用行锁定。我错了吗?
    • 关于这个问题的任何更新?我有同样的想法,想知道这个问题是否在默认情况下使用 spring jpa 是不可能的
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2012-01-31
    • 2014-08-21
    • 2013-12-02
    • 2018-03-17
    相关资源
    最近更新 更多