当前位置:首页 > JavaScript

js实现事务

2026-02-01 21:20:44JavaScript

事务的基本概念

事务是指一组操作要么全部成功,要么全部失败回滚的机制。在JavaScript中,事务通常用于数据库操作或需要原子性执行的业务逻辑。

使用数据库事务(以MySQL为例)

在Node.js中操作MySQL数据库时,可以通过连接对象的beginTransactioncommitrollback方法实现事务。

js实现事务

const mysql = require('mysql');
const connection = mysql.createConnection({/* 配置 */});

connection.beginTransaction(err => {
  if (err) throw err;

  connection.query('UPDATE accounts SET balance = balance - 100 WHERE id = 1', (err, result) => {
    if (err) {
      return connection.rollback(() => {
        throw err;
      });
    }

    connection.query('UPDATE accounts SET balance = balance + 100 WHERE id = 2', (err, result) => {
      if (err) {
        return connection.rollback(() => {
          throw err;
        });
      }

      connection.commit(err => {
        if (err) {
          return connection.rollback(() => {
            throw err;
          });
        }
        console.log('事务执行成功');
      });
    });
  });
});

使用MongoDB事务

MongoDB 4.0+支持多文档事务,可以通过以下方式实现:

js实现事务

const { MongoClient } = require('mongodb');
const client = new MongoClient('mongodb://localhost:27017');

async function runTransaction() {
  const session = client.startSession();
  try {
    await session.withTransaction(async () => {
      const accounts = client.db('test').collection('accounts');
      await accounts.updateOne({ id: 1 }, { $inc: { balance: -100 } }, { session });
      await accounts.updateOne({ id: 2 }, { $inc: { balance: 100 } }, { session });
    });
  } finally {
    await session.endSession();
  }
}

实现自定义事务逻辑

对于非数据库操作,可以手动实现事务模式:

class Transaction {
  constructor() {
    this.operations = [];
    this.rollbackOperations = [];
  }

  add(execute, rollback) {
    this.operations.push(execute);
    this.rollbackOperations.unshift(rollback);
  }

  async execute() {
    try {
      for (const op of this.operations) {
        await op();
      }
    } catch (error) {
      for (const rollbackOp of this.rollbackOperations) {
        await rollbackOp();
      }
      throw error;
    }
  }
}

// 使用示例
const transaction = new Transaction();
transaction.add(
  () => updateAccount1(),
  () => rollbackAccount1()
);
transaction.add(
  () => updateAccount2(),
  () => rollbackAccount2()
);
transaction.execute().catch(console.error);

使用Promise实现简单事务

对于简单的异步操作,可以使用Promise链实现事务效果:

let account1Updated = false;
let account2Updated = false;

updateAccount1()
  .then(() => {
    account1Updated = true;
    return updateAccount2();
  })
  .then(() => {
    account2Updated = true;
    console.log('事务完成');
  })
  .catch(err => {
    if (account1Updated && !account2Updated) {
      rollbackAccount1();
    }
    console.error('事务失败', err);
  });

注意事项

数据库事务的具体实现方式取决于使用的数据库驱动和版本。事务操作会带来性能开销,应仅在必要时使用。对于复杂的业务逻辑,可以考虑使用事务脚本模式或领域驱动设计来管理事务边界。

标签: 事务js
分享给朋友:

相关文章

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 //…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…