ADAM/AzMan 中的并发更新引发了一个奇怪的错误

Posted

技术标签:

【中文标题】ADAM/AzMan 中的并发更新引发了一个奇怪的错误【英文标题】:Concurrent updates in ADAM/AzMan throwing a strange error 【发布时间】:2010-12-15 23:48:40 【问题描述】:

我们有一个使用 WCF 服务和 ADAM/AzMan 的自定义成员资格提供程序。我们最近看到了很多错误,这似乎与我们的网络应用程序的大量使用相对应。

我发现在 Web 应用程序中,每次用户登录时都会对管理员帐户进行更新。

在大量使用的情况下,似乎有两个不同的进程正在尝试更新管理员帐户中的配置文件信息。我看到的错误是:

COMException - Cannot create a file when that file already exists.

这是来自 AzMan。

我的问题是:在 ADAM/AzMan 中尝试对同一记录(甚至是同一个 ADAM 实例)进行并发更新是否会引发错误,并且该错误是否超出了我应该预期的错误?

编辑我们删除了不断更新管理员帐户的代码,这大大减少了错误。我们仍然偶尔会遇到错误。我们有几个应用程序都使用相同的 ADAM 实例。如果其中几个应用尝试更新 ADAM 中的数据,这会导致问题吗?

【问题讨论】:

【参考方案1】:

如何阅读here

中的授权管理器没有 策略时支持并发 存储在 XML 中

授权管理器确实利用 Active Directory 支持 并发。活动目录和 ADAM 有一个非事务模型 支持并发添加和 多值或链接的减法 对象属性。在活动目录中 和 ADAM,对象属性的更改 是原子的(在属性级别)所以 你永远不会有一个属性是 两个变化的网格。活动目录 使用“最后一位作家获胜”机制 确定哪个写请求将 坚持。属性永远不会合并; 一个写请求(最后一次写 收到)将永远赢。对于广告 链接属性(例如 授权经理角色和组 成员资格,或之间的链接 操作、任务和角色 定义)变化是累加的;所以 同时加减 用户或链接和取消链接 操作、任务和角色是 支持的。然而,授权 Manager MMC 管理单元 UI 维护一个 未更新的客户端缓存 当商店从一些改变 其他 UI 或应用程序;所以, 需要多个应用程序 并发管理员需要一个 自定义用户界面。

我个人更喜欢使用 SQL Server 作为授权管理器策略存储。如果您创建一个新的基于 SQL 的策略存储并查看相应数据库的内部,您将在几乎所有表中看到 timestamp 类型的 RowUpdateTimeStamp 列。不仅如此,许多表还有binary(8) 类型的额外ChildUpdateTimeStamp 列和XX_UpdateParentTimeStampOnXXX 触发器。所有这些都表明,至少基于 SQL 的授权管理器策略存储旨在支持并发。问题只是这部分没有真正记录在案,具体会收到哪些错误/异常也不清楚。

再说一句。如果您还没有使用IAzAuthorizationStore::UpdateCache,您可以考虑使用它之前在 AzMan 商店中进行更改。

【讨论】:

以上是关于ADAM/AzMan 中的并发更新引发了一个奇怪的错误的主要内容,如果未能解决你的问题,请参考以下文章

数据库事务

将 firebase 库更新到 16.0.0 会引发 google play services 依赖问题

事务的四个特性,以及在并发环境下可能引发的一些问题

Django奇怪的SlugField验证,在clean()之前没有引发错误,返回了未清理的数据

引发错误,防止 MySQL 触发器中的表更新

并发编程专题