MySQL 和 MongoDB 的同时确保数据一致性,需要在两者中都使用事务,并在其中一个操作失败时回滚事务。可以通过以下步骤来实现这一点:

  • 启动 MySQL 事务。
  • 启动 MongoDB 事务。
  • 执行 MySQL 操作。
  • 执行 MongoDB 操作。
  • 如果所有操作都成功,提交两个事务。
  • 如果任何操作失败,回滚两个事务。

示例代码如下:

const mysql = require('mysql2/promise');
const { MongoClient } = require('mongodb');

async function performTransactions() {
    // 配置 MySQL 连接
    const mysqlConnection = await mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: 'password',
        database: 'test'
    });

    // 配置 MongoDB 连接
    const mongoClient = new MongoClient('mongodb://localhost:27017');
    await mongoClient.connect();
    const mongoSession = mongoClient.startSession();

    try {
        // 开始 MySQL 事务
        await mysqlConnection.beginTransaction();

        // 开始 MongoDB 事务
        mongoSession.startTransaction();

        // 执行 MySQL 操作
        await mysqlConnection.query('INSERT INTO users (name, age) VALUES (?, ?)', ['Alice', 30]);

        // 执行 MongoDB 操作
        const usersCollection = mongoClient.db('test').collection('users');
        await usersCollection.insertOne({ name: 'Bob', age: 25 }, { session: mongoSession });

        // 提交 MySQL 事务
        await mysqlConnection.commit();

        // 提交 MongoDB 事务
        await mongoSession.commitTransaction();

        console.log('Both transactions committed.');

    } catch (error) {
        // 回滚 MySQL 事务
        await mysqlConnection.rollback();
        
        // 回滚 MongoDB 事务
        await mongoSession.abortTransaction();

        console.error('Transaction aborted due to an error: ', error);
    } finally {
        // 结束 MySQL 连接
        await mysqlConnection.end();

        // 结束 MongoDB 会话
        mongoSession.endSession();

        // 关闭 MongoDB 连接
        await mongoClient.close();
    }
}

performTransactions().catch(console.error);

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐