Sequelize 支持两种使用事务的方式:
- 非托管事务: 提交和回滚事务应由用户手动完成(通过调用适当的 Sequelize 方法).
- 托管事务:
- 如果引发任何错误,Sequelize 将自动回滚事务,否则将提交事务.
- 另外,如果启用了CLS(连续本地存储), 则事务回调中的所有查询将自动接收事务对象.
非托管事务
// 首先,我们开始一个事务并将其保存到变量中
const t = await sequelize.transaction();
try {
// 然后,我们进行一些调用以将此事务作为参数传递:
const user = await User.create({
firstName: 'Bart',
lastName: 'Simpson'
}, { transaction: t });
await user.addSibling({
firstName: 'Lisa',
lastName: 'Simpson'
}, { transaction: t });
// 如果执行到此行,且没有引发任何错误.
// 我们手动提交事务.
await t.commit();
} catch (error) {
// 如果执行到达此行,则抛出错误.
// 我们回滚事务.
await t.rollback();
}
托管事务
try {
const result = await sequelize.transaction(async (t) => {
const user = await User.create({
firstName: 'Abraham',
lastName: 'Lincoln'
}, { transaction: t });
await user.setShooter({
firstName: 'John',
lastName: 'Boothe'
}, { transaction: t });
return user;
});
// 如果执行到此行,则表示事务已成功提交,`result`是事务返回的结果
// `result` 就是从事务回调中返回的结果(在这种情况下为 `user`)
} catch (error) {
// 如果执行到此,则发生错误.
// 该事务已由 Sequelize 自动回滚!
}
defaultScope作用域
作用域在模型 Model中定义,可以是查找器对象,也可以是返回查找器对象的函数
默认作用域除外,该作用域只能是一个对象
class UserModel extends Model { }
UserModel.init({
// 属性
}, {
defaultScope: { // 默认作用域
where: {
active: true
}
},
scopes: {
deleted: {
where: {
deleted: true
}
},
activeUsers: {
include: [
{ model: User, where: { active: true } }
]
},
random() {
return {
where: {
someNumber: Math.random()
}
}
}
},
sequelize,
modelName: 'user'
});
// 用法就是调用scope方法传入字符串,返回一个查询对象
await UserModel.scope('deleted').findAll();
SELECT * FROM user WHERE deleted = true // sql
await UserModel.scope('random', { method: ['accessLevel', 19] }).findAll();
SELECT * FROM user WHERE someNumber = 42 AND accessLevel >= 19;