事务

模型中提供了对事务操作的支持,但前提需要数据库支持事务。

Mysql 中的 InnoDBBDB 存储引擎支持事务,如果在 Mysql 下使用事务的话,需要将数据库的存储引擎设置为 InnoDB 或 BDB。

SQLite 直接支持事务。

使用事务

模型中提供了 startTranscommitrollback 3 种方法来操作事务。

  • startTrans 开启事务
  • commit 正常操作后,提交事务
  • rollback 操作异常后进行回滚

    ES6 方式

  1. export default class extends think.controller.base {
  2. async indexAction(){
  3. let model = this.model('user');
  4. try{
  5. await model.startTrans();
  6. let userId = await model.add({name: 'xxx'});
  7. let insertId = await this.model('user_group').add({user_id: userId, group_id: 1000});
  8. await model.commit();
  9. }catch(e){
  10. await model.rollback();
  11. }
  12. }
  13. }

动态创建类的方式

  1. module.exports = think.controller({
  2. indexAction: function(self){
  3. var model = this.model('user');
  4. return model.startTrans().then(function(){
  5. return model.add({name: 'xxx'});
  6. }).then(function(userId){
  7. return self.model('user_group').add({user_id: userId, group_id: 1000})
  8. }).then(function(){
  9. return self.commit();
  10. }).catch(function(err){
  11. return self.rollback();
  12. });
  13. }
  14. })

transaction 方法

使用事务时,要一直使用 startTranscommitrollback 这 3 个方法进行操作,使用起来有一些不便。为了简化这一操作,模型中提供了 transaction 方法来更加方便的处理事务。

ES6 方式

  1. export default class extends think.controller.base {
  2. async indexAction(self){
  3. let model = this.model('user');
  4. let insertId = await model.transaction( function * (){
  5. let userId = await model.add({name: 'xxx'});
  6. return await self.model('user_group').add({user_id: userId, group_id: 1000});
  7. })
  8. }
  9. }

注:Arrow Function 无法和 /yield 一起写,所以上面为 function 。如果想使用 Arrow Function,可以使用 async,如: async () => {}

使用动态创建类的方式

  1. module.exports = think.controller({
  2. indexAction: function(self){
  3. var model = this.model('user');
  4. return model.transaction(function(){
  5. return model.add({name: 'xxx'}).then(function(userId){
  6. return self.model('user_group').add({user_id: userId, group_id: 1000});
  7. });
  8. }).then(function(insertId){
  9. }).catch(function(err){
  10. })
  11. }
  12. })

transaction 接收一个回调函数,这个回调函数中处理真正的逻辑,并需要返回。

原文: https://thinkjs.org/zh-cn/doc/2.1/model_transaction.html