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 // sqlawait UserModel.scope('random', { method: ['accessLevel', 19] }).findAll();SELECT * FROM user WHERE someNumber = 42 AND accessLevel >= 19;
