17

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

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

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

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

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

4

2 回答 2

11

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

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

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

一些随机的想法——我微软可能会在 ActiveDirectory 中添加这样的东西(因为它不仅仅是LDAP),但如果他们还没有的话,他们可能不会。

于 2009-08-10T15:50:57.523 回答
1

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

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

于 2017-01-07T18:16:02.640 回答