当使用sequelize声明一个事务时,如何实现某些语句都不在事务中?

时间:2017-07-04 06:43:29

标签: node.js sequelize.js

在陈述交易时,如何实现某些陈述是在交易之外。

请参阅以下示例,第一个create语句没有获得transaction选项,因此它应该不在事务中,并且在回滚时它应该在数据库中。但是,两者都在交易中并且都回滚。任何意见?

    describe.only('sequelzie transaction test', () => {
        const sequelize = new Sequelize('test', null, null, {
            dialect: 'sqlite',
    })

    const UserModel = sequelize.define('user', {
        name: {
            type: Sequelize.STRING,
            primaryKey: true,
        },
    })
    beforeEach (async () => {
        await sequelize.sync({force: true})
    })


    it('partial rollback transaction should work', async () => {
        const transaction  = await sequelize.transaction()
        try {
            await UserModel.create({name: 'ron'} )
            await UserModel.create({name: 'ron', {transaction}})
            await transaction.commit()
        }
        catch (e) {
            await transaction.rollback()
        }

        const users = await UserModel.findAll()
        expect(users).to.have.length(1) // failed here, it was 0, both are rolled back
    })
})

1 个答案:

答案 0 :(得分:0)

我在您的代码中发现的一个问题是在create function

中错误地传递了事务
await UserModel.create({name: 'ron'}, {transaction})

交易是期权对象的一部分。还可以尝试启用调试选项以检查正在执行的查询。你将能够辨别出这个问题。