Vis*_*ran 1 mysql node.js express sequelize.js
我正在使用MySQL开发nodejs 。在将数据插入到多个表中时,我需要实现事务管理。这样,如果发生任何错误,我就可以回滚所有插入。
所有与DB相关的操作都在DB层中每个实体的不同类中声明。在单个操作上的业务逻辑层中,我们可能需要处理来自不同实体的多个数据库层调用。在JAVA Spring中,我们可以在服务层上简单地注释 @Transaction。
nodejs中有类似的东西吗?
NodeJs mysql具有非常好的事务管理,但与Spring并不完全相似。但是概念很相似-
连接到数据库使用 connect
使用开始交易 beginTransaction
rollback。这将中止事务。commitend一个例子 -
const mysql = require('mysql');
const connection = mysql.createConnection(
{
host : 'YOUR_HOST',
user : 'YOUR_USERNAME',
password : 'YOUR_PASSWORD',
database : 'YOUR_DB_NAME'
}
);
connection.connect(function(err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected as id ' + connection.threadId);
});
/* Begin transaction */
connection.beginTransaction(function(err) {
if (err) { throw err; }
connection.query('YOUR QUERY', "PLACE HOLDER VALUES", function(err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
const log = result.insertId;
connection.query('ANOTHER QUERY PART OF TRANSACTION', log, function(err, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
connection.commit(function(err) {
if (err) {
connection.rollback(function() {
throw err;
});
}
console.log('Transaction Completed Successfully.');
connection.end();
});
});
});
});
/* End transaction */Run Code Online (Sandbox Code Playgroud)
如果您想使其更具动态性,那就只是一个想法。我在代码中添加了一些注释。您可能需要更改代码以适合您的要求。基本上,您将查询数组与查询值一起传递,然后所有这些查询都在事务中运行。--
function executeTransaction(queries) {
try {
const connection = yield getConnectionObj({/* your db params to get connection */)
let results = []
return new Promise(function(resolve, reject) {
connection.beginTransaction(function (err) {
if (err) throw err
console.log("Starting transaction")
queries
.reduce(function (sequence, queryToRun) {
return sequence.then(function () {
/* pass your query and connection to a helper function and execute query there */
return queryConnection(
connection,
query,
queryParams,
).then(function (res) {
/* Accumulate resposes of all queries */
results = results.concat(res)
})
}).catch(function (error) {
reject(error)
})
}, Promise.resolve())
.then(function () {
connection.commit(function (err) {
if (err) {
connection.rollback(function () {
throw err
})
}
console.log('Transactions were completed!')
/* release connection */
connection.release()
/* resolve promise with all results */
resolve({ results })
})
})
.catch(function (err) {
console.log('Transaction failed!')
connection.rollback(function () {
console.log('Abort Transaction !!!')
throw err
})
})
})
})
/* End Transaction */
} catch (error) {
return Promise.reject(error)
}
}Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
3025 次 |
| 最近记录: |