91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node Mysql事務處理封裝

發布時間:2020-07-16 10:07:00 來源:網絡 閱讀:4299 作者:janwool 欄目:MySQL數據庫

node回調函數的方式使得數據庫事務貌似并沒有像java、php那樣編寫簡單,網上找了一些事務處理的封裝并沒有達到自己預期的那樣簡單編寫,還是自己封裝一個吧。
封裝的大體思路很簡單:函數接受一個事務處理的函數,如何處理事務的邏輯由該函數確定,而不是像網上封裝的事務是對組裝多條預處理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(‘事務提交失敗’)
     })

上述案例是我截取項目的一段代碼,從上面代碼顯然可以很容易封裝自己的邏輯,可以執行不同路徑的事務流程。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

名山县| 华容县| 崇文区| 五常市| 天津市| 临高县| 通山县| 南和县| 漯河市| 岚皋县| 五原县| 株洲市| 保亭| 正镶白旗| 崇明县| 扎兰屯市| 宁化县| 思茅市| 台江县| 云龙县| 阿拉尔市| 贡觉县| 大新县| 建宁县| 阿荣旗| 宝兴县| 铜陵市| 富裕县| 凤冈县| 云霄县| 吉木萨尔县| 长丰县| 台湾省| 辉南县| 始兴县| 隆林| 霞浦县| 天津市| 合肥市| 洱源县| 岗巴县|