uni-app 事务失败错误: transaction already commit
uni-app 事务失败错误: transaction already commit
产品分类:uniCloud/App
示例代码:
const transaction = await db.startTransaction()
try{
//写数据库代码略.........
await transaction.commit()
console.log(`transaction succeeded`)
return {
success: true,
order_no: order_no,
total_fee:orderHead.total_fee
}
}catch(e) {
await transaction.rollback()
console.error(`transaction error`, e)
return {
success: false,
error: e
}
}
//控制台结果,已经打印出 transaction succeeded,却抛出事务失败?
10:18:55.087 [本地调试]transaction succeeded uniCloud-aliyun/cloudfunctions
10:18:55.090 [本地调试]Error: 事务失败错误: transaction already commit
10:18:55.090 [本地调试] at new Promise (<anonymous>)
操作步骤:
const transaction = await db.startTransaction()
try{
//写数据库代码略.........
await transaction.commit()
console.log(`transaction succeeded`)
return {
success: true,
order_no: order_no,
total_fee:orderHead.total_fee
}
}catch(e) {
await transaction.rollback()
console.error(`transaction error`, e)
return {
success: false,
error: e
}
}
//控制台结果,已经打印出 transaction succeeded,却抛出事务失败?
10:18:55.087 [本地调试]transaction succeeded uniCloud-aliyun/cloudfunctions
10:18:55.090 [本地调试]Error: 事务失败错误: transaction already commit
10:18:55.090 [本地调试] at new Promise (<anonymous>)
预期结果:
return {
success: true,
order_no: order_no,
total_fee:orderHead.total_fee
}
实际结果:
return {
success: false,
error: e
}
bug描述:
const transaction = await db.startTransaction()
try{
//写数据库代码略.........
await transaction.commit()
console.log(`transaction succeeded`)
return {
success: true,
order_no: order_no,
total_fee:orderHead.total_fee
}
}catch(e) {
await transaction.rollback()
console.error(`transaction error`, e)
return {
success: false,
error: e
}
}
//控制台结果,已经打印出 transaction succeeded,却抛出事务失败?
10:18:55.087 [本地调试]transaction succeeded uniCloud-aliyun/cloudfunctions
10:18:55.090 [本地调试]Error: 事务失败错误: transaction already commit
10:18:55.090 [本地调试] at new Promise (<anonymous>)
本地调试:uni-h5.es.js:19612
POST http://127.0.0.1:7000/cloudfunctions/my-save-order 500 (Internal Server Error)
6 回复
catch里面的e打印一下
回复 2***@qq.com: 谢谢,放后面错误被屏蔽了
catch 打印出来的 Error: 事务失败错误: transaction already commit
把你的这行打印放在rollback前面。
在 uni-app 中,如果你在使用本地存储(如 uni.setStorage
或 uni.setStorageSync
)时遇到 “transaction already commit” 错误,通常是因为你在一个事务中尝试提交已经提交的事务,或者事务已经被关闭。
可能的原因和解决方案:
-
重复提交事务:
- 如果你在一个事务中多次调用
commit
方法,会导致这个错误。确保每个事务只提交一次。 - 示例:
const transaction = uni.getStorageInfoSync(); transaction.setItem('key', 'value'); transaction.commit(); // 提交事务 // transaction.commit(); // 重复提交会导致错误
- 如果你在一个事务中多次调用
-
事务已经关闭:
- 如果你在事务已经关闭后尝试操作,也会导致这个错误。确保在事务关闭前完成所有操作。
- 示例:
const transaction = uni.getStorageInfoSync(); transaction.setItem('key', 'value'); transaction.commit(); // 提交事务 // transaction.setItem('key2', 'value2'); // 事务已经关闭,操作会导致错误
-
异步操作中的事务管理:
- 如果你在异步操作中管理事务,确保在异步操作完成后再提交事务。
- 示例:
const transaction = uni.getStorageInfoSync(); someAsyncFunction().then(() => { transaction.setItem('key', 'value'); transaction.commit(); // 在异步操作完成后提交事务 });
-
使用
try-catch
捕获错误:- 使用
try-catch
块来捕获和处理可能的错误,避免程序崩溃。 - 示例:
try { const transaction = uni.getStorageInfoSync(); transaction.setItem('key', 'value'); transaction.commit(); } catch (error) { console.error('Transaction error:', error); }
- 使用