egg-mysql 事务
时间: 2025-04-29 07:43:17 浏览: 12
### 在 Egg.js 中使用 MySQL 进行事务操作
Egg.js 是一个基于 Koa 的企业级开发框架,提供了丰富的插件支持来简化数据库交互。对于 MySQL 数据库的操作,通常会借助 `egg-mysql` 插件完成基本的数据访问功能。
为了实现更复杂的业务逻辑,比如确保一系列 SQL 操作要么全部成功执行,要么完全不发生(即原子性),可以利用 MySQL 提供的事务机制。下面展示了一个简单的例子说明如何在 Egg.js 应用程序中配置并使用 MySQL 事务[^1]:
#### 安装依赖包
首先,在项目根目录下通过 npm 或 yarn 添加必要的模块:
```bash
npm install --save egg-mysql
```
或者
```bash
yarn add egg-mysql
```
#### 启用插件
编辑项目的 `config/plugin.js` 文件以启用该插件:
```javascript
// config/plugin.js
exports.mysql = {
enable: true,
package: 'egg-mysql',
};
```
#### 配置连接参数
接着设置好相应的数据库链接信息于 `config/config.default.js` 内部:
```javascript
// config/config.default.js
module.exports = appInfo => ({
...,
mysql: {
client: {
host: 'localhost',
port: '3306',
user: 'root',
password: '',
database: 'test'
},
app: true,
agent: false
}
});
```
#### 创建模型和服务层方法
假设有一个场景涉及两个表之间的关联更新——订单(order)和库存(stock),这里创建对应的 Model 和 Service 方法用于演示目的。
```typescript
// app/model/order.ts
const OrderModel = app.Model.extend({
tableName: 'orders',
});
export default OrderModel;
```
```typescript
// app/service/transactionService.ts
import { Service } from 'egg';
class TransactionService extends Service {
public async createOrderWithStockDeduction() {
try {
await this.ctx.transaction(async (t) => {
// 开始事务
// 执行第一个查询语句 - 增加新订单记录
const resultOfInsertingNewOrderRecord = await t.query(`
INSERT INTO orders SET ?
`, [{ product_id: 1, quantity: 2 }]);
// 获取刚刚插入的新订单ID
let orderId = resultOfInsertingNewOrderRecord.insertId;
// 减少对应商品数量
await t.query(`
UPDATE stocks
SET amount=amount-?
WHERE id=?
`, [2, 1]);
console.log(`Transaction succeeded! New order ID=${orderId}`);
});
} catch (err) {
throw err;
}
}
}
export default TransactionService;
```
上述代码片段展示了如何在一个名为 `createOrderWithStockDeduction()` 的服务函数内部启动一个新的事务,并尝试向订单表中添加一条新的销售记录的同时减少相应产品的库存量。如果任意一步失败,则整个过程会被回滚;只有当所有步骤都顺利完成之后才会提交更改给数据库永久保存下来[^2]。
#### 控制器调用
最后可以在控制器里面调用这个服务的方法来进行实际的操作:
```typescript
// app/controller/exampleController.ts
import { Controller } from 'egg';
import transactionService from '../service/transactionService';
class ExampleController extends Controller {
public async executeTransactionExample() {
const serviceInstance = new transactionService(this.ctx);
try {
await serviceInstance.createOrderWithStockDeduction();
this.ctx.body = { message: "Operation completed successfully." };
} catch(error){
this.ctx.status = 500;
this.ctx.body = { error: `${error}` };
}
}
}
export default ExampleController;
```
以上就是在 Egg.js 中集成 MySQL 并实施事务控制的一种方式。需要注意的是具体的应用场景可能会有所不同,因此还需要根据实际情况调整相关细节[^3]。
阅读全文
相关推荐


















