简单的问题,但我无法在任何地方找到答案:是Active Directory事务感知吗?
换句话说,将回滚以下更改(因为我没有调用scope.Complete()
):
using (var scope = new TransactionScope())
{
DirectoryEntry entry = ...;
entry.Properties["givenName"].Value = "New Given Name";
entry.CommitChanges();
}
如果没有,是否有可能以某种方式启用此功能?现在我有代码执行数据库更新和相应的AD更新,如果它们以某种方式失败,我有AD更新的补偿逻辑。这个解决方案远非最优。
亲切的问候, 罗纳德威尔登伯格
答案 0 :(得分:9)
简短的回答是 - 不。 ActiveDirectory本质上是一个LDAP实现(有一些花哨的扩展,但它的核心仍然是LDAP)。 LDAP协议和规范都没有事务概念,所以这实际上是不可能的。
可以在客户端模拟交易,但你必须自己做或者使用Spring,我相信会为你做这件事 - 显然这不像你那样服务器端交易那么安全d期望来自DB。关于Spring的一个注释 - 我不完全确定Spring.NET是否支持LDAP的“事务”,但它们在Spring的Java实现中有类似的东西。可能值得一看。
通过阅读关于CommitChanges方法的文档,它只是说它将您的更改发送到服务器 - 如果它没有说明它们是事务安全的话我会认为它们不是。
一些随意的想法 - 我猜测微软可能会在ActiveDirectory上添加类似的东西(因为它不仅仅是只是 LDAP),但它们可能赢了“如果他们还没有。
答案 1 :(得分:1)
没有。 LDAP并不直接支持交易,但是,您可以自己推送自己的交易。编写实现IEnlistmentNotification接口的登记类的解决方案。 IEnlistmentNotification适用于System.Transactions命名空间中的显式和隐式事务。
您可以在此处找到更多文档(和示例):https://msdn.microsoft.com/en-us/library/system.transactions.ienlistmentnotification(v=vs.110).aspx