node回調(diào)函數(shù)的方式使得數(shù)據(jù)庫(kù)事務(wù)貌似并沒有像java、php那樣編寫簡(jiǎn)單,網(wǎng)上找了一些事務(wù)處理的封裝并沒有達(dá)到自己預(yù)期的那樣簡(jiǎn)單編寫,還是自己封裝一個(gè)吧。
封裝的大體思路很簡(jiǎn)單:函數(shù)接受一個(gè)事務(wù)處理的函數(shù),如何處理事務(wù)的邏輯由該函數(shù)確定,而不是像網(wǎng)上封裝的事務(wù)是對(duì)組裝多條預(yù)處理SQL和參數(shù)。該事務(wù)處理函數(shù)要求返回Promise。這樣我們就可以通過(guò)該P(yáng)romise來(lái)確定是提交事務(wù)還是回滾事務(wù)了。
根據(jù)上述思路,實(shí)現(xiàn)代碼:
創(chuàng)新互聯(lián)是專業(yè)的沙坪壩網(wǎng)站建設(shè)公司,沙坪壩接單;提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行沙坪壩網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
let MySQL = require('mysql')
let config = require('../config')
let pool = mysql.createPool(config.database) //config.databa數(shù)據(jù)庫(kù)配置
let trans = (tran) => {
return new Promise((resolve, reject) => { //返回promise提供事務(wù)成功與失敗的接口
pool.getConnection((err, conn) => {
if(err) {
reject(err)
}else {
conn.beginTransaction((err) => { //開始事務(wù)處理
if(err) {
conn.release()
reject(err)
}else {
let promise = tran(conn) //調(diào)用事務(wù)處理函數(shù)
promise.then(result => {
conn.commit(err => { //事務(wù)處理函數(shù)resolve則提交事務(wù)
if(err) {
reject(err)
}else {
resolve(result)
}
})
}).catch(err => {
conn.rollback(() => { //事務(wù)處理函數(shù)reject則回滾事務(wù)
conn.release()
reject(err)
})
})
}
})
}
})
})
}
事務(wù)處理函數(shù)接受數(shù)據(jù)庫(kù)連接對(duì)象conn,這里我封裝了數(shù)據(jù)庫(kù)執(zhí)行語(yǔ)句:
trans.query = (conn, sql, params) => {
return new Promise((resolve, reject) => {
conn.query(sql, params,(err, result) => {
if(err) {
reject(err)
}else {
resolve(result)
}
})
})
}
上面事務(wù)處理封裝完成,應(yīng)用就和正常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(‘事務(wù)提交成功’)
}).catch(err => {
console.log(‘事務(wù)提交失敗’)
})
上述案例是我截取項(xiàng)目的一段代碼,從上面代碼顯然可以很容易封裝自己的邏輯,可以執(zhí)行不同路徑的事務(wù)流程。
當(dāng)前題目:NodeMysql事務(wù)處理封裝
當(dāng)前URL:http://jinyejixie.com/article14/ghhsde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)頁(yè)設(shè)計(jì)公司、微信公眾號(hào)、關(guān)鍵詞優(yōu)化、全網(wǎng)營(yíng)銷推廣、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)