在GraphQL + Sequelize + CLS中抛出错误后,事务仍然自动提交

时间:2016-01-17 12:09:26

标签: postgresql transactions sequelize.js graphql

我想知道编码中是否有任何部分我做错了。 我试图做一系列的功能和检查,如果有一些条件没有满足,我想回滚事务。

我在stackoverflow

参考了参考资料

在抛出新错误后,我的事务仍然会被提交。

这是我的示例编码。

//db.js
import Sequelize from 'sequelize';
import Cls from 'continuation-local-storage';
Sequelize.cls = Cls.createNamespace('db');
const Conn = new Sequelize(
    'relay',
    'postgres',
    'tec832',
    {
    dialect: 'postgres',
        host: 'localhost'
    }
);
module.exports.Db = Conn;
在schema.js中

我有

Db.transaction({autocommit: false}).then(()=>{
    args = {vcTitle: {$ilike: `Sample title by Nick`}};
    return testDelPostPromiseNoTran(args).then(obResult => {
        throw new Error("Wrong account type");
    })
});

function testDelPostPromiseNoTran(args){
    return new Promise((resolve, reject) => {
        resolve(delDataNoTran('Post', args));
    });
}

//I am trying to do a standard delete
function delDataNoTran(vcTbName, args){
    return Db.models[vcTbName].destroy({where: args})
    .then(result =>{
        if(result > 0){
            return true;
        }else{
            return false;
        }
    })
    .error(obStatus =>{
        return false;
    });
}

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

Db.transaction({autocommit: false}).then(()=>{
    args = {vcTitle: {$ilike: `Sample title by Nick`}};
    return testDelPostPromiseNoTran(args).then(obResult => {
        throw new Error("Wrong account type");
    })
});

应该......

Db.transaction(()=>{
    args = {vcTitle: {$ilike: `Sample title by Nick`}};
    return testDelPostPromiseNoTran(args).then(obResult => {
        throw new Error("Wrong account type");
    })
});

您应该将功能传递给Db.transaction。将其放在.then()块内意味着它在事务之后运行,因此不会包含在事务内。这是你的主要问题。

function testDelPostPromiseNoTran(args){
    return new Promise((resolve, reject) => {
        resolve(delDataNoTran('Post', args));
    });
}

...返回一个永远解决的承诺。这是多余的,因为delDataNoTran已经返回一个承诺 - 没有理由将它包装在另一个承诺中。

args = {vcTitle: {$ilike: `Sample title by Nick`}};

“ilike”应该是“iLike”(区分大小写。)

我建议花一些时间阅读Sequelize docs