Ich erstelle eine Hilfsklasse für NodeJs, die mir bei der Verwaltung von Datenbanktransaktionen hilft.
Meine Idee ist, eine Methode wie diese zu erstellen:
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(); }) }
und verwenden Sie es so:
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(....) })
Ich hatte gehofft, dass es funktionieren würde, aber anscheinend ist das Ergebnis dieses:
beginTransaction commit do query 1 do query 2 do query 3
Glauben Sie, dass es möglich ist, eine Funktion transactionBlock
返回一个承诺,用户可以在其中执行查询,最后,如果所有查询都正常,函数 transactionBlock
zu erstellen, die den Commit durchführt?
Ich verwende Folgendes: npmjs.com/package/promise-mysql
Vielen Dank Auf Wiedersehen
您当前方法的大问题是
finally()
始终 运行,无论承诺链解决还是拒绝,因此您绝对不想提交那里进行交易。我在这里只看到一个选项...需要一个代表交易主体的回调函数。
一般来说,我还建议使用
async / wait
语法以提高可读性。这样调用
如果您使用 Typescript,以下接口和类型将确保顺利运行