Java OpenLDAP和未绑定:事务的使用

Java OpenLDAP和未绑定:事务的使用,java,transactions,ldap,openldap,unboundid-ldap-sdk,Java,Transactions,Ldap,Openldap,Unboundid Ldap Sdk,我使用OpenLDAP作为LDAP服务器,并通过Java代码与之交互。我需要处理实体a的某个实例X的移除,该实体a上有几个其他实例Y1。。实体B的Yn是逻辑链接的。这意味着我首先需要删除B(Y1,…Yn)的所有实例,然后还要删除X。我希望能够使用一个事务来完成这项工作,以便在删除其中一个Y1,…Yn时出现问题时中止事务,并有可能回滚。 我尝试了以下示例: 但我得到的是一个LDAPException,它说扩展操作是不受支持的。 我如何处理交易?我认为OpenLDAP确实支持事务…我并不是最新的O

我使用OpenLDAP作为LDAP服务器,并通过Java代码与之交互。我需要处理实体a的某个实例X的移除,该实体a上有几个其他实例Y1。。实体B的Yn是逻辑链接的。这意味着我首先需要删除B(Y1,…Yn)的所有实例,然后还要删除X。我希望能够使用一个事务来完成这项工作,以便在删除其中一个Y1,…Yn时出现问题时中止事务,并有可能回滚。 我尝试了以下示例:

但我得到的是一个LDAPException,它说扩展操作是不受支持的。
我如何处理交易?我认为OpenLDAP确实支持事务…

我并不是最新的OpenLDAP,但我最后听到的是OpenLDAP还没有像RFC 5805中所描述的那样添加对LDAP事务的支持。但是,您应该能够通过查看OpenLDAP根DSE来检查这一点。在Unbounded LDAP SDK for Java中,您可以使用以下代码执行此操作:

 RootDSE rootDSE = ldapConnection.getRootDSE();
 boolean supportsTransactions = rootDSE.supportsExtendedOperation(
      StartTransactionExtendedRequest.START_TRANSACTION_REQUEST_OID);
如果OpenLDAP服务器还不支持事务,那么您可能无法使其真正原子化,并且在遇到问题时能够回滚。如果OpenLDAP支持实验性LDAP无操作控制(我认为它支持),那么可以使用com.unboundd.LDAP.sdk.experimental.DraftZeilengaLDAPNoOp12RequestControl类将其包含在删除请求中,以查看服务器是否接受删除所有条目,然后,只有在看起来他们都会成功的情况下才继续删除。否则,您可以在应用程序中保留一个日志,以便在发生故障时报告删除的内容和未删除的内容


Neil

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

 RootDSE rootDSE = ldapConnection.getRootDSE();
 boolean supportsTransactions = rootDSE.supportsExtendedOperation(
      StartTransactionExtendedRequest.START_TRANSACTION_REQUEST_OID);
如果OpenLDAP服务器还不支持事务,那么您可能无法使其真正原子化,并且在遇到问题时能够回滚。如果OpenLDAP支持实验性LDAP无操作控制(我认为它支持),那么可以使用com.unboundd.LDAP.sdk.experimental.DraftZeilengaLDAPNoOp12RequestControl类将其包含在删除请求中,以查看服务器是否接受删除所有条目,然后,只有在看起来他们都会成功的情况下才继续删除。否则,您可以在应用程序中保留一个日志,以便在发生故障时报告删除的内容和未删除的内容


尼尔

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

您根本不必执行此类操作。如果您告诉OpenLDAP“refint”引用完整性模块保持这些属性上的引用完整性,那么它可以为您执行二次删除,因此您所要做的就是主删除。

我尝试使用DraftZeilengAldanPoop12RequestControl,但我得到了错误:resultCode=12(不可用的关键扩展),errorMessage='critical extension未被识别'。。。我认为它不受支持,我必须坚持使用“手动”基于日志的解决方案。我尝试使用DraftZeilengaLDAPNoOp12RequestControl,但我得到了错误:resultCode=12(不可用的关键扩展),errorMessage='critical extension is not recognized'。。。我认为它不受支持,我必须坚持使用“手动”基于日志的解决方案。因此,使用“refint”引用完整性模块,我可以避免二次删除,最重要的是,确保如果执行主删除,所有相关的删除都将执行?顺便说一句,我检查了refint模块,发现它不能解决问题。事实上,如果我删除一个条目,refint模块可以更新条目中引用已删除条目的字段,但这还不足以实现我所寻找的行为。特别是,在我看来,由于删除了另一个条目,所以不可能在级联中删除N个条目。@Raffo那么您想删除引用条目本身吗?是的,这就是想法。我有一个条目(X),删除该条目将删除所有“链接”条目(Yi)。特别是,X代表系统的一个用户,Yi是用户帐户,我需要处理删除与该用户相关的帐户的操作…@Raffo你运气不好。OpenLDAP在2.5版之前不支持事务,请参阅。因此,使用“refint”引用完整性模块可以避免二次删除,最重要的是,确保如果执行主删除,将执行所有相关的删除?顺便说一句,我检查了refint模块,发现它没有解决问题。事实上,如果我删除一个条目,refint模块可以更新条目中引用已删除条目的字段,但这还不足以实现我所寻找的行为。特别是,在我看来,由于删除了另一个条目,所以不可能在级联中删除N个条目。@Raffo那么您想删除引用条目本身吗?是的,这就是想法。我有一个条目(X),删除该条目将删除所有“链接”条目(Yi)。特别是,X代表系统的一个用户,Yi是用户帐户,我需要处理删除与该用户相关的帐户的操作…@Raffo你运气不好。OpenLDAP在版本2.5之前不支持事务,请参阅。