目 录CONTENT

文章目录

nodejs中mysql的事务操作

Administrator
2020-08-09 / 0 评论 / 0 点赞 / 5468 阅读 / 3933 字

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("执行失败");
    });

这个时候的数据库事务执行失败,我们到数据库里面查看的时候,数据并没有插入成功

0

评论区