如何使用mongoDB执行“全有或全无”操作?

时间:2012-12-30 02:44:40

标签: c# mongodb transactions push insertion

我需要在文档的字段数组中插入一些元素。嗯......我知道Mongo有原子Update.Push ......事实是我需要在许多文档中进行这种插入。案例如下(我需要为每个用户名插入一个角色数组):

 public override void AddUsersToRoles(string[] usernames, string[] roleNames)
        {
            foreach (string role in roleNames)
            {
                if (!this.RoleExists(role))
                {
                    throw new ProviderException(String.Format("The role '{0}' was not found.", role));
                }
            }

            //How to guarantee that all users will be updated with roles?
            foreach (string user in usernames)
            {
                var docs = this.users.Update(Query.And(Query.EQ("Username", user),
                    Query.EQ("Applications.Name", this.ApplicationName)), Update.AddToSetEach("Applications.$.Roles", 
                   new BsonArray(roleNames)));
            }
        }

假设在将“角色”推送到第三个用户名时关闭。我需要回滚以前的操作。任何的想法?

1 个答案:

答案 0 :(得分:2)

根据我对MongoDB的理解,它与多个集合不符合ACID。现在,如果您一次更新一个集合,那么您应该很好。否则,非ACID合规性是盒子上警告标签的一部分,如果你愿意的话。