Node Mysql事務處理封裝
阿新 • • 發佈:2018-04-04
Node Mysql 事務處理 node回調函數的方式使得數據庫事務貌似並沒有像java、php那樣編寫簡單,網上找了一些事務處理的封裝並沒有達到自己預期的那樣簡單編寫,還是自己封裝一個吧。
封裝的大體思路很簡單:函數接受一個事務處理的函數,如何處理事務的邏輯由該函數確定,而不是像網上封裝的事務是對組裝多條預處理SQL和參數。該事務處理函數要求返回Promise。這樣我們就可以通過該Promise來確定是提交事務還是回滾事務了。
根據上述思路,實現代碼:
封裝的大體思路很簡單:函數接受一個事務處理的函數,如何處理事務的邏輯由該函數確定,而不是像網上封裝的事務是對組裝多條預處理SQL和參數。該事務處理函數要求返回Promise。這樣我們就可以通過該Promise來確定是提交事務還是回滾事務了。
根據上述思路,實現代碼:
let mysql = require(‘mysql‘) let config = require(‘../config‘) let pool = mysql.createPool(config.database) //config.databa數據庫配置 let trans = (tran) => { return new Promise((resolve, reject) => { //返回promise提供事務成功與失敗的接口 pool.getConnection((err, conn) => { if(err) { reject(err) }else { conn.beginTransaction((err) => { //開始事務處理 if(err) { conn.release() reject(err) }else { let promise = tran(conn) //調用事務處理函數 promise.then(result => { conn.commit(err => { //事務處理函數resolve則提交事務 if(err) { reject(err) }else { resolve(result) } }) }).catch(err => { conn.rollback(() => { //事務處理函數reject則回滾事務 conn.release() reject(err) }) }) } }) } }) }) }
事務處理函數接受數據庫連接對象conn,這裏我封裝了數據庫執行語句:
trans.query = (conn, sql, params) => { return new Promise((resolve, reject) => { conn.query(sql, params,(err, result) => { if(err) { reject(err) }else { resolve(result) } }) }) }
上面事務處理封裝完成,應用就和正常Promise使用相同:
trans((conn) => { return trans.query(conn, db_user.register.user, [username, password, new Date().getTime()]) .then(result => { return trans.query(conn,db_user.login, [username]) }).then(result => { return trans.query(conn,db_user.register.profile,[result[0].id, nickname]) }) }).then(result=>{ console.log(‘事務提交成功’) }).catch(err => { console.log(‘事務提交失敗’) })
上述案例是我截取項目的一段代碼,從上面代碼顯然可以很容易封裝自己的邏輯,可以執行不同路徑的事務流程。
Node Mysql事務處理封裝