NodeJs mysql 開啓事務

如題;node後臺使用mysql數據庫,並使用事務來管理數據庫操做。node

這裏主要講一個事務的封裝並寫了一個INSERT 插入操做。mysql

code:sql

基礎code:

db.config.js數據庫

const mysql = require('mysql')

const pool = mysql.createPool({
  connectionLimit: 20, //鏈接池鏈接數
  host: 'localhost', //數據庫地址,這裏用的是本地
  database: 'xxxx', //數據庫名稱
  user: 'xxxxx',  // username
  password: '*****' // password
})
//返回一個Promise連接
const connectHandle = () => new Promise((resolve, reject) => {
  pool.getConnection((err, connection) => {
    if(err) {
      console.error('連接錯誤:' + err.stack + '\n' + '連接ID:' + connection.threadId)
      reject(err)
    } else {
      resolve(connection)
    }
  })
})



module.exports = connectHandle

事務操做

const connectHandler = require('./db.config') //引入上面所講的數據庫基礎配置

const insertHandler = async (vals) => {
  const connection = await connectHandler() // 獲得連接
  const tablename = 'xxxxx' //動態table(表)名稱
  //開啓事務
  connection.beginTransaction( err => {
    if(err) {
      return '開啓事務失敗'
    } else {
       //執行INSERT插入操做
      connection.query(`INSERT INTO ${tablename} SET ?`, vals, (e, rows, fields) => {
        if(e) {
          return connection.rollback(() => {
            console.log('插入失敗數據回滾')
          })
        } else {
          connection.commit((error) => {
            if(error) {
              console.log('事務提交失敗')
            }
          })
          connection.release()  // 釋放連接
          return {rows, success: true}  // 返回數據庫操做結果這裏數據格式可根據我的或團隊規範來定製
        }
      })
    }
  })
}


module.exports = {
  insertHandler
}

相關操做步驟已經在註釋中寫明,本人實測有效。如需使用需加上本身的數據庫配置及相關代表等動態配置。async

相關文章
相關標籤/搜索