Saya sedang mencipta kelas utiliti untuk NodeJs untuk membantu saya menguruskan transaksi pangkalan data.
Idea saya adalah untuk mencipta kaedah seperti ini:
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(); }) }
dan gunakannya seperti ini:
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(....) })
Saya berharap ia akan berkesan, tetapi nampaknya hasilnya adalah ini:
beginTransaction commit do query 1 do query 2 do query 3
Adakah anda fikir mungkin untuk mencipta fungsi transactionBlock
返回一个承诺,用户可以在其中执行查询,最后,如果所有查询都正常,函数 transactionBlock
yang akan melaksanakan komit?
Saya menggunakan ini: npmjs.com/package/promise-mysql
Terima kasih Selamat tinggal
Masalah besar dengan pendekatan semasa anda ialah
finally()
sentiasa berjalan tanpa mengira sama ada rantaian janji diselesaikan atau ditolak, jadi anda pasti tidak mahu melakukan transaksi di sana.Saya hanya melihat satu pilihan di sini...memerlukan fungsi panggil balik yang mewakili badan transaksi.
Secara umum, saya juga mengesyorkan menggunakan sintaks
async / wait
untuk kebolehbacaan yang lebih baik.Panggil macam ni
Jika anda menggunakan Typescript, antara muka dan jenis berikut akan memastikan operasi lancar