1,Transaction
是Sequelize
中用于实现事务功能的子类,通过调用Sequelize.transaction()
方法可以创建一个该类的实例。在Sequelize
中,支持自动提交/回滚,也可以支持用户手动提交/回滚。
先看自动提交和回滚的。
return sequelize.transaction(function (t) { // 要确保所有的查询链都有return返回 return User.create({ firstName: 'Abraham', lastName: 'Lincoln' }, {transaction: t}).then(function (user) { return user.setShooter({ firstName: 'John', lastName: 'Boothe' }, {transaction: t}); }); }).then(function (result) { // Transaction 会自动提交 // result 是事务回调中使用promise链中执行结果 }).catch(function (err) { // Transaction 会自动回滚 // err 是事务回调中使用promise链中的异常结果 });
受管理的事务会自动提交或回滚,你可以向sequelize.transaction
方法传递一个回调函数来启动一个事务。
需要注意,在这种方式下传递给回调函数的transaction
会返回一个promise
链,在promise
链中(then
或catch
)中并不能调用t.commit()
或t.rollback()
来控制事务。在这种方式下,如果使用事务的所有promise
链都执行成功,则自动提交;如果其中之一执行失败,则自动回滚。
使用受管理的事务时,不能通过手工调用的方式来提交或回滚事务。但在需要时(如验证失败),可以通过throw
来抛出异常回滚事务。
{ transaction: t }
选项来手工传递事务。
不受管理的事务需要你强制提交或回滚,如果不进行这些操作,事务会一直保持挂起状态直到超时。
启动一个不受管理的事务,同样是调用sequelize.transaction()
方法,但不传递回调函数参数(仍然可以传递选项参数)。然后可以在其返回的promisethen
方法中手工控制事务:
return sequelize.transaction().then(function (t) { return User.create({ firstName: 'Homer', lastName: 'Simpson' }, {transaction: t}).then(function (user) { return user.addSibling({ firstName: 'Lisa', lastName: 'Simpson' }, {transaction: t}); }).then(function () { return t.commit(); }).catch(function (err) { return t.rollback(); }); });