代码之家  ›  专栏  ›  技术社区  ›  Dan Polites

未找到父密钥-Spring事务管理

  •  1
  • Dan Polites  · 技术社区  · 15 年前

    我正在使用具有表示层、业务层和DAO层的典型三层应用程序。它是一个JavaWeb应用程序,它使用Spring MVC、Spring Security和Spring的事务管理从业务层向下。它正在与Oracle10g数据库通信。

    我有一个名为CreateDepartment的业务层方法。在这个方法中,我对DAO层进行了两次调用,以创建部门并为该部门创建一个职位。每次执行此操作时,当尝试创建位置时,都会得到一个“未找到父键”异常。如果我将CreatePosition向上移动到表示层(事务管理之外),它就会工作。

    我可以在Oracle的SQL开发人员中复制它。如果我创建了一个部门,在关闭连接并获得新的部门之前,我无法看到该部门,因此我可以了解为什么无法创建该职位。与大多数SQL插入不同的是,应用程序正在使用Oracle的标签安全功能,并且所有部门都分配了一个标签。因此,创建部门时,将创建一个新标签。

    如何使部门在创建它所使用的连接中可见?

    1 回复  |  直到 15 年前
        1
  •  2
  •   skaffman    15 年前

    在我看来,创建“职位”的DAO调用实际上与创建部门的DAO调用在不同的连接和/或事务上运行。这与观察结果一致:

    • 当在事务内部创建部门,然后尝试在其他事务中创建职位时,创建该部门的事务尚未提交,因此失败。
    • 当部门在DAO事务之外创建时,它将被提交,然后职位将被创建为OK。

    请确保DAO中只有一个事务边界,并确保创建位置的调用不会无意中创建新事务或连接。SpringDebyug级别的日志对于跟踪这一点非常有用,它非常详细地描述了每个连接的get/release和tx的start/end边界。