【问题标题】:Is Active Directory transaction-aware?Active Directory 事务感知吗?
【发布时间】:2009-08-07 14:19:09
【问题描述】:

简单的问题,但我在任何地方都找不到答案:Active Directory 事务感知吗?

也就是说,是否会回滚以下更改(因为我没有调用scope.Complete()):

using (var scope = new TransactionScope())
{
    DirectoryEntry entry = ...;
    entry.Properties["givenName"].Value = "New Given Name";
    entry.CommitChanges();
}

如果没有,是否有可能以某种方式启用它?现在我有执行数据库更新和相应的 AD 更新的代码,如果 AD 更新以某种方式失败,我有补偿逻辑。这个解决方案远非最佳。

亲切的问候, 罗纳德·维尔登伯格

【问题讨论】:

  • 为什么不能自己测试呢?我找不到任何关于 AD 是否具有交易意识的明确文档 - 我会认为(并希望!)是这样! LDAP 通常似乎是事务感知的,至少
  • 目前我正在使用一台未加入域的机器......这应该今天修复,所以我将执行一些测试。奇怪的是,似乎没有关于这个主题的任何文档。

标签: .net active-directory transactions msdtc


【解决方案1】:

简短的回答是 - 不。 ActiveDirectory 本质上是一个 LDAP 实现(有一些花哨的扩展,但它的核心仍然是 LDAP)。 LDAP 协议和规范都没有事务的概念,所以这确实是不可能的。

可以在客户端模拟事务,但您必须自己执行或使用 Spring,我相信它会为您执行此操作 - 显然这不如您的服务器端事务安全d 期望来自数据库。关于 Spring 的注释 - 我不完全确定 Spring.NET 是否支持 LDAP 的“事务”,但它们在 Spring 的 Java 实现中有类似的东西。可能值得一看。

通过阅读有关 CommitChanges 方法的文档,它只是说它将您的更改发送到服务器 - 如果它没有说明它们是事务安全的,我会假设它们不是。

一些随意的想法 - 我微软可能会在 ActiveDirectory 上添加类似的东西(因为它不仅仅是 只是 LDAP),但他们可能不会t 如果他们还没有。

【讨论】:

  • 我终于有时间和机会做一个小测试,AD 不是事务性的。但是,我找不到任何有关 Spring 为 LDAP 资源提供事务支持的文档。你确定他们实现了这个吗?当底层资源(例如 Active Directory)不是事务感知时,您剩下的唯一选择是使用事务感知 API 包装资源的(整个)API,并自己正确响应提交和回滚。它是 Java (JNDI) 还是 C# (System.DirectoryServices) 并不重要,但这是我所知道的唯一方法。
  • 看看这个:springsource.org/ldap 我自己没用过,但这就是我在说的。它说“Spring LDAP 提供事务支持”,但我的印象是,正如您所说,它是整个 LDAP API 的包装器,用于跟踪故障等并尝试回滚、重放等。
【解决方案2】:

没有。 LDAP 不直接支持事务,但是,可以通过编写实现 IEnlistmentNotification 接口的登记类来“推出自己的”解决方案。 IEnlistmentNotification 适用于 System.Transactions 命名空间中的显式和隐式事务。

您可以在此处找到更多文档(和示例):https://msdn.microsoft.com/en-us/library/system.transactions.ienlistmentnotification(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多