当前位置:首页 > JavaScript

js实现事务

2026-02-01 21:20:44JavaScript

事务的基本概念

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

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

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

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+支持多文档事务,可以通过以下方式实现:

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链实现事务效果:

js实现事务

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
分享给朋友:

相关文章

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js 实现继承

js 实现继承

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

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…