# 事務
[TOC=2,3]
模型中提供了對事務操作的支持,但前提需要數據庫支持事務。
`Mysql`?中的?`InnoDB`?和?`BDB`?存儲引擎支持事務,如果在 Mysql 下使用事務的話,需要將數據庫的存儲引擎設置為 InnoDB 或 BDB。
`SQLite`?直接支持事務。
## 使用事務
模型中提供了?`startTrans`,`commit`?和?`rollback`?3 種方法來操作事務。
* `startTrans`?開啟事務
* `commit`?正常操作后,提交事務
* `rollback`?操作異常后進行回滾
#### ES6 方式
~~~
export default class extends think.controller.base {
* indexAction(){
let model = this.model("user");
try{
yield model.startTrans();
let userId = yield model.add({name: "xxx"});
let insertId = yield this.model("user_group").add({user_id: userId, group_id: 1000});
yield model.commit();
}catch(e){
yield model.rollback();
}
}
}
~~~
#### 動態創建類的方式
~~~
module.exports = think.controller({
indexAction: function(self){
var model = this.model("user");
return model.startTrans().then(function(){
return model.add({name: "xxx"});
}).then(function(userId){
return self.model("user_group").add({user_id: userId, group_id: 1000})
}).then(function(){
return self.commit();
}).catch(function(err){
return self.rollback();
});
}
})
~~~
## transaction 方法
使用事務時,要一直使用?`startTrans`,`commit`?和?`rollback`?這 3 個方法進行操作,使用起來有一些不便。為了簡化這一操作,模型中提供了?`transaction`?方法來更加方便的處理事務。
#### ES6 方式
~~~
export default class extends think.controller.base {
* indexAction(self){
let model = this.model("user");
let insertId = yield model.transaction( function * (){
let userId = yield model.add({name: "xxx"});
return yield self.model("user_group").add({user_id: userId, group_id: 1000});
})
}
}
~~~
注:Arrow Function 無法和?`*/yield`?一起寫,所以上面為?`function *`。如果想使用 Arrow Function,可以使用 async,如:?`async () => {}`。
#### 使用動態創建類的方式
~~~
module.exports = think.controller({
indexAction: function(self){
var model = this.model("user");
return model.transaction(function(){
return model.add({name: "xxx"}).then(function(userId){
return self.model("user_group").add({user_id: userId, group_id: 1000});
});
}).then(function(insertId){
}).catch(function(err){
})
}
})
~~~
* * *
transaction 接收一個回調函數,這個回調函數中處理真正的邏輯,并需要返回。
- 快速入門
- 介紹
- 創建項目
- 項目結構
- 代碼規范
- 升級指南
- 進階應用
- 模塊
- 控制器
- 視圖
- 配置
- 路由
- 模型
- 介紹
- 事務
- 關聯模型
- Mysql
- MongoDB
- SQLite
- Adapter
- 介紹
- Cache
- Session
- WebSocket
- Template
- 擴展功能
- thinkjs 命令
- 靜態資源訪問
- Middleware
- Service
- Cookie
- 錯誤處理
- 錯誤信息
- 數據校驗
- 國際化
- 路徑常量
- REST API
- 定時任務
- 線上部署
- 推薦模塊
- API
- think
- think.base
- think.http.base
- http
- controller
- rest controller
- model
- model.mongo
- middleware