如上面的链接提供的例子。这个里边给出的例子是从A用户转10元给B用户,如果用事务的的话,应该是在操作A-10完成,B+10失败的时候才需要进行事务的rollback呀?为啥例子中是查找A,B账号中某一个不存在就进行rollback? 而没有放在A-10,B+10这两个成功与否上?另外,如果try里边的操作如果发生异常(例如:恰巧是A-10操作完成了,而B+10操作抛异常),被catch 捕获到,那么这个时候不应该进行rollback 吗?
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database({
throwOnNotFound: false,
})
const _ = db.command
exports.main = async (event) => {
try {
const transaction = await db.startTransaction()
const aaaRes = await transaction.collection('account').doc('aaa').get()
const bbbRes = await transaction.collection('account').doc('bbb').get()
if (aaaRes.data && bbbRes.data) {
const updateAAARes = await transaction.collection('account').doc('aaa').update({
data: {
amount: _.inc(-10)
}
})
const updateBBBRes = await transaction.collection('account').doc('bbb').update({
data: {
amount: _.inc(10)
}
})
await transaction.commit()
console.log(`transaction succeeded`)
return {
success: true,
aaaAccount: aaaRes.data.amount - 10,
}
} else {
await transaction.rollback()
return {
success: false,
error: `rollback`,
rollbackCode: -100,
}
}
} catch (e) {
console.error(`transaction error`, e)
return {
success: false,
error: e
}
}
}
你好,事务操作commit后才会整体执行,可以自己尝试一下去理解
data: {
amount: _.inc(10)
}
})我写错了,或者因为某种原因发生异常的时候被catch 住了,那么这个时候怎么返回原点?因为这个时候不走else,而是走catch里边了吧,难道catch 会自动rollback?
throwOnNotFound: false,
})的话是不是就没办法根据if (aaaRes.data && bbbRes.data)为假进行rollback返回原点了,对吗?我需要对每条更新(删除,添加)操作的结果进行判断来确定是不是需要进行rollback?多谢!