1

我使用 OpenLDAP 作为 LDAP 服务器和 UnboundID 通过 Java 代码与之交互。我需要处理实体 A 的某个实例 X 的删除,实体 B 的几个其他实例 Y1、.. Yn 在其上逻辑链接。这意味着我首先需要删除 B (Y1, ... Yn) 的所有实例,然后我还想删除 X。我希望能够使用事务来执行此操作,以便中止事务如果在删除 Y1,..Yn 之一时出现问题,并且有可能回滚。我尝试按照以下示例进行操作:

https://www.unboundid.com/products/ldap-sdk/docs/javadoc/com/unboundid/ldap/sdk/extensions/StartTransactionExtendedRequest.html

不过,我得到的是一个 LDAPException,表示不支持扩展操作。我该如何处理交易?我认为 OpenLDAP 确实支持事务...

4

2 回答 2

3

我并没有真正了解 OpenLDAP 的最新信息,但我听到的最后一个消息是 OpenLDAP 尚未添加对 RFC 5805 中描述的 LDAP 事务的支持。但是,您应该能够通过查看 OpenLDAP 来检查这一点根 DSE。在 UnboundID LDAP SDK for Java 中,您可以使用如下代码执行此操作:

 RootDSE rootDSE = ldapConnection.getRootDSE();
 boolean supportsTransactions = rootDSE.supportsExtendedOperation(
      StartTransactionExtendedRequest.START_TRANSACTION_REQUEST_OID);

如果 OpenLDAP 服务器还不支持事务,那么您可能无法做任何事情来使其真正原子化并且在遇到问题时能够回滚。如果 OpenLDAP 支持实验性 LDAP 无操作控制(我认为确实如此),那么您可以使用 com.unboundid.ldap.sdk.experimental.DraftZeilengaLDAPNoOp12RequestControl 类将其包含在删除请求中,以查看服务器是否会接受删除所有条目,然后只有在看起来它们都将成功时才继续删除。否则,您可以在应用程序中保留日志,以便在发生故障时报告哪些内容已删除,哪些内容未删除。

尼尔

于 2012-07-06T02:53:27.743 回答
1

你根本不应该做这种事情。如果您告诉 OpenLDAP 'refint' 参照完整性模块维护这些属性的参照完整性,它可以为您执行二次删除,因此您所要做的就是主要删除。

于 2012-07-07T07:02:14.810 回答