我正在為 NodeJs 建立一個實用程式類別來幫助我管理資料庫事務。
我的想法是創建一個這樣的方法:
transactionBlock(params) { let _db; return mySqlConnector.getConnection(params.db) .then(db => { _db = db; console.log(`beginTransaction`); return db.beginTransaction() }) .then(() => { return Promise.resolve(_db); }) .catch((e) => { console.log(`roolback`); _db.rollback(); }) .finally(() => { console.log(`commit`); _db.commit(); }) }
並這樣使用它:
const params = {db:"my_db"}; transactionBlock(params) .then(db =>{ console.log(`do query 1`); db.insert(....) console.log(`do query 2`); db.insert(....) console.log(`do query 3`); db.insert(....) })
我希望它能起作用,但顯然結果如下:
beginTransaction commit do query 1 do query 2 do query 3
您認為是否可以建立一個函數 transactionBlock
傳回一個承諾,使用者可以在其中執行查詢,最後,如果所有查詢都正常,函數 transactionBlock
會執行提交?
我用這個:npmjs.com/package/promise-mysql
謝謝 再見###
您目前方法的大問題是
finally()
總是 運行,無論承諾鏈解決還是拒絕,因此您絕對不想提交那裡進行交易。我在這裡只看到一個選項...需要一個代表交易主體的回呼函數。
一般來說,我還建議使用
async / wait
語法來提高可讀性。這樣呼叫
如果您使用 Typescript,以下介面和類型將確保順利執行