Является ли Active Directory транзакцией?
Простой вопрос, но я не могу найти ответ нигде: осведомлен ли о транзакции Active Directory?
Другими словами, будет отменено следующее изменение (поскольку я не вызывал scope.Complete()
):
using (var scope = new TransactionScope())
{
DirectoryEntry entry = ...;
entry.Properties["givenName"].Value = "New Given Name";
entry.CommitChanges();
}
Если нет, возможно ли это как-то включить? Прямо сейчас у меня есть код, который выполняет обновления баз данных и соответствующие обновления AD, и у меня есть компенсационная логика обновлений AD, если они как-то терпят неудачу. Это решение далеко не оптимально.
С уважением,
Рональд Вильденберг
Ответы
Ответ 1
Короткий ответ - нет. ActiveDirectory - это, по сути, реализация LDAP (с некоторыми причудливыми расширениями, но у нее в основном это LDAP). Ни протоколы LDAP, ни спецификации не имеют концепции транзакций, поэтому это действительно невозможно.
Можно было бы эмулировать транзакции на стороне клиента, но вам придется сделать это самостоятельно или использовать Spring, который, я полагаю, сделает это для вас - очевидно, это не так безопасно, как транзакции на стороне сервера, которые вы ожидаете от БД. Заметка в Spring - я не совсем уверен, что Spring.NET поддерживает "транзакции" для LDAP, но они имеют что-то подобное в реализации Java Spring. Возможно, стоит посмотреть.
Из чтения документов в методе CommitChanges он просто говорит, что он отправляет ваши изменения на сервер - если он не говорит о том, что они безопасны в транзакции, я бы предположил, что это не так.
Некоторые случайные мысли - возможно, Microsoft могла бы добавить что-то вроде этого в ActiveDirectory (поскольку это больше, чем просто LDAP), но они, вероятно, не будут, если они еще не появились.
Ответ 2
Нет. LDAP напрямую не поддерживает транзакции, однако можно "сворачивать свое" решение, написав класс призыва, который реализует интерфейс IEnlistmentNotification. IEnlistmentNotification работает как с явными, так и с неявными транзакциями в пространстве имен System.Transactions.
Здесь вы можете найти дополнительную документацию (и пример): https://msdn.microsoft.com/en-us/library/system.transactions.ienlistmentnotification(v=vs.110).aspx