读取类的方法的读/写锁

时间:2017-02-03 20:23:22

标签: java sql groovy dependency-injection locking

我目前正致力于从两个不同数据库读取和写入的RESTful Web服务。我遇到的问题是处理我的服务被调用的情况,然后在第一次完成写入之前收到第二个调用。该服务读取数据库中的日期字段以确定是否需要INSERT或UPDATE,然后在所选操作中写入该字段。如果在第一次调用完成之前进行第二次调用,则不会写入日期字段,因此我最终得到两个INSERTS而不是INSERT和UPDATE。

我尝试使用java和groovy中提供的并发API,但到目前为止我还没有能够使用它。 RESTful服务每次调用时都会查找模型类的新副本。然后,模型类通过依赖注入获取groovy对象的新实例。因此,我无法在任何一个地方放置一个Lock实例,因为每次调用RESTful服务都将处理模型的新实例和groovy。

有人能建议更好的方法吗?任何帮助将不胜感激。

更新

这是服务的一些伪代码

  
      
  1. 按数据库1的表A中的id查找模型数据。
  2.   
  3. 查找数据库2的表B中最新的条目,其中id与存储在模型中的密钥(dw_id)匹配。
  4.   
  5. 比较“开始日期”'结果列到当前日期时间。
  6.         

    如果,那么' start_date ==当天然后

         

    4A。使用数据对数据库2的表B执行UPDATE查询   从模型中获得。

         

    其他

         

    5a上。在数据库2的表B上执行UPDATE查询,替换   具有昨天日期的end_date列的值,其中id == dw_id。

         

    5b中。使用来自的数据在数据库2的表B上执行INSERT   模型,将start_date设置为今天的日期,将end_date设置为a   不断的未来约会。

         

    图5c。在数据库1的表A上执行UPDATE,替换dw_id   具有由...创建的条目的自动生成的id的模型   从5b插入。

更新2

我最终实现了与jan-willem-gmelig-meyling提出的解决方案类似的功能。我在这里找到了一个很好的实现示例:https://stackoverflow.com/a/27806218/32453我能够适应我的需求。

1 个答案:

答案 0 :(得分:1)

在Java中,您可以通过同步锁定对象来完成此操作。但是,只有在启动数据库事务之前获取此锁定时,此方法才有效。否则,两个并行线程将同时启动数据库事务并以隔离的数据库版本存在。所以你大致得到的是:

private final static Object lock = new Object();

public void myResource() {
    synchronized (lock) {
        // begin tx, do work, end tx.
        // Other callee won't get here before first callee is finished
    }
}

然而,这会破坏所有服务器无状态约定。在事务中实际锁定数据库表要好得多。这可以防止另一个连接同时读取和写入同一个表。您可以调查数据库(或ORM库,如果使用任何)支持哪些锁定机制。可以使用诸如JTA之类的技术在服务器,服务或多个数据库之间共享数据库事务。

相关问题