uni-app 事务失败错误: transaction already commit

发布于 1周前 作者 wuwangju 来自 Uni-App

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打印一下


Error: 事务失败错误: transaction already commit

回复 2***@qq.com: 谢谢,放后面错误被屏蔽了

catch 打印出来的 Error: 事务失败错误: transaction already commit

把你的这行打印放在rollback前面。

在 uni-app 中,如果你在使用本地存储(如 uni.setStorageuni.setStorageSync)时遇到 “transaction already commit” 错误,通常是因为你在一个事务中尝试提交已经提交的事务,或者事务已经被关闭。

可能的原因和解决方案:

  1. 重复提交事务

    • 如果你在一个事务中多次调用 commit 方法,会导致这个错误。确保每个事务只提交一次。
    • 示例:
      const transaction = uni.getStorageInfoSync();
      transaction.setItem('key', 'value');
      transaction.commit(); // 提交事务
      // transaction.commit(); // 重复提交会导致错误
  2. 事务已经关闭

    • 如果你在事务已经关闭后尝试操作,也会导致这个错误。确保在事务关闭前完成所有操作。
    • 示例:
      const transaction = uni.getStorageInfoSync();
      transaction.setItem('key', 'value');
      transaction.commit(); // 提交事务
      // transaction.setItem('key2', 'value2'); // 事务已经关闭,操作会导致错误
  3. 异步操作中的事务管理

    • 如果你在异步操作中管理事务,确保在异步操作完成后再提交事务。
    • 示例:
      const transaction = uni.getStorageInfoSync();
      someAsyncFunction().then(() => {
          transaction.setItem('key', 'value');
          transaction.commit(); // 在异步操作完成后提交事务
      });
  4. 使用 try-catch 捕获错误

    • 使用 try-catch 块来捕获和处理可能的错误,避免程序崩溃。
    • 示例:
      try {
          const transaction = uni.getStorageInfoSync();
          transaction.setItem('key', 'value');
          transaction.commit();
      } catch (error) {
          console.error('Transaction error:', error);
      }
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!