nodejs中mysql的事务操作
在NodeJS里面,操作MySql数据库的时候,没有直接的进行数据库事务操作的方法,需要依赖于第三方的模块来自己手动封装方法,现将自己封装的方式修改以后,列举如下
const mysql2 = require("mysql2");
class DBUtils {
getConn() {
const conn = mysql2.createConnection({
host: "127.0.0.1",
port: 3306,
user: "root",
password: "xxxxxx",
database: "test"
});
conn.connect();
return conn;
}
executeSql(strSql, params = []) {
return new Promise((resolve, reject) => {
let conn = this.getConn();
conn.query(strSql, params, (error, result) => {
if (error) {
reject(error);
}
else {
resolve(result);
}
conn.end();
})
})
}
/**
* 执行数据库事务
* @param {Array<{strSql:string,params:[]}>} listSqlEntity
*/
transactionSql(listSqlEntity) {
return new Promise((resolve, reject) => {
let conn = this.getConn();
conn.beginTransaction(error => {
if (error) {
//开启事务失败
console.log("开启事务失败");
return reject(error);
}
//开始执行事务
})
let arr = listSqlEntity.map(item => {
return new Promise((resolve, reject) => {
conn.query(item.strSql, item.params, (error, result) => {
if (error) {
reject(error);
}
else {
resolve(result);
}
})
})
});
Promise.all(arr)
.then(resultArr => {
conn.commit();
resolve(resultArr);
}).catch(error => {
conn.rollback();
reject(error);
}).finally(() => {
console.log("关闭数据库连接");
conn.end();
})
})
}
}
module.exports = DBUtils;
将上面的代码封装完成以后,我们可以撑试着去进行一下测试
测试上面的封闭是否正确
const DBUtils = require("./DBUtils");
const db = new DBUtils();
let list = [{
strSql: "insert into custom_info (nick_name,age) values (?,?)",
params: ["张三7", 15]
}, {
strSql: "insert into custom_info (nick_name,age) values (?,?)",
params: ["李四7",20]
}]
db.transactionSql(list)
.then(results => {
console.log(results);
console.log("执行成功");
}).catch(error => {
console.log(error);
console.log("执行失败");
});
在上面的代码当中,所以的Sql语句都可以正常执行,所以是没有问题的
当我们执行上面的代码的时候,有第一条SQL语句与第三条SQL语句执行是同一个主键插入,这个时候,整个事务就会提交失败
let list2 = [{
strSql: "insert into custom_info (nick_name,age) values (?,?)",
params: ["张三7", 15]
}, {
strSql: "insert into custom_info (nick_name,age) values (?,?)",
params: ["李四7"]
}]
这个时候我们将第二条sql语句的参数少了个,这样SQL语句是会执行失败的,我们再去调用上面的封装去执行
db.transactionSql(list2)
.then(results => {
console.log(results);
console.log("执行成功");
}).catch(error => {
console.log(error);
console.log("执行失败");
});
这个时候的数据库事务执行失败,我们到数据库里面查看的时候,数据并没有插入成功
评论区