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);