多个模型的水线交易

时间:2014-10-30 22:43:29

标签: transactions sails.js waterline

我正在使用Sails waterline mysql适配器来管理数据库,

假设我有两个模型,即客户和合同,当我创建合同时,我还需要找到或创建此客户。但我有可能创建了这个客户,然后合同未能创建。所以我试图获得交易方式。

https://github.com/balderdashy/waterline/issues/62我发现一个模型上的交易。比如查找和创建

Customer.transaction().findOne({name:"aaa"}).done(function(err,data){
 if(err) data.rollback(callback); 
 if(!data)//does not exist
 Customer.create({name:"aaa"}).done(function(err,data2){
data.save().commit()
});
});

但是,如果我需要创建两个模型,则应创建或不创建两个模型。就像合同失败一样,也不应该创建客户端。我该怎么做?

 Customer.transaction().create({name:"aaa"}).done(function(err,client){
 if(err) return client.rollback(callback); 
 Contract.create({contractname:"bbb"}).done(function(err,contract){
 if(err) return client.rollback(callback);
   client.save().commit()
 });
 });

这个client.save()还会控制契约模型吗?

由于

1 个答案:

答案 0 :(得分:0)

我没有真正检查transaction()上的源代码。然后我最终做了别的事情:

我首先创建一个nativeQuery函数,以便在promise

中进行查询调用
nativeQuery=function(query){
    var promise=Promise.defer();
    [AnyModel].query(query,function(err,data){
        if(err) promise.reject(err);
        promise.resolve(data);
    });
    return promise.promise;
}

然后我使用旧时尚启动事务语法

nativeQuery('START TRANSACTION').then(function(){
    do stuff
}).then(function(data){
    return nativeQuery('COMMIT');
}).fail(function(err){
    return nativeQuery('ROLLBACK');
});

没有真正使用水线交易的东西......