繁体   English   中英

flutter firestore 中同一文档的多个事务失败

[英]Multiple transactions to same document failure in flutter firestore

我一直在尝试对 flutter 应用程序中的同一文档实施多个事务,该应用程序使用 firestore 作为其数据库,但它使应用程序崩溃。 当它在 Xcode 或 android studio 的原生应用程序中实现时,同样的事情这个问题甚至一次都没有发生。

是否有任何指南如何在 flutter firestore 中使多个交易成功。

例如,如果来自不同设备的超过 1 个用户同时对同一文档进行交易,则交易失败并且应用程序崩溃。

这怎么能解决?

Firestore.instance.runTransaction((Transaction tx) async {
      DocumentSnapshot postSnapshot = await tx.get(docRef);
      if (postSnapshot.exists) {
        await tx.update(docRef, <String, dynamic>{'likes': postSnapshot.data['likes'] + 1});
       // print("transaction completed");
      }
    })

错误日志

2020-05-27 18:43:14.529 1022-1344/dev.jideguru.social_app_ui E/AndroidRuntime:致命异常:AsyncTask #4 进程:dev.jideguru.social_app_ui,PID:1022 java.lang.RuntimeException:发生错误executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:353) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) at java.util.concurrent.FutureTask.setException(FutureTask. java:252) at java.util.concurrent.FutureTask.run(FutureTask.java:271) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) Caused by: java.lang.AssertionError: INTERNAL断言失败:A 事务 object 在其更新回调被调用后不能使用。 在 com.google.firebase.firestore.util.Assert.fail(com.google.firebase:firebase-firestore@@21.3.0:46) 在 com.google.firebase.firestore.util.Assert( .firebase:firebase-firestore@@21.3.0:31) 在 com.google.firebase.firestore.core.Transaction.ensureCommitNotCalled(com.google.firebase:firebase-firestore@@21.3.0:240.66)8 在 801google708 .firebase.firestore.core.Transaction.lookup(com.google.firebase:firebase-firestore@@21.3.0:81) 在 com.google.firebase.firestore.Transaction.getAsync(com.google.8826046:6firebase57788 @@21.3.0:191) at com.google.firebase.firestore.Transaction.get(com.google.firebase:firebase-firestore@@21.3.0:228) at io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin$5. doInBackground(CloudFirestorePlugin.java:613)位于 io.flutter.plugins.firebase.cloudfirestor e.CloudFirestorePlugin$5.doInBackground(CloudFirestorePlugin.java:608) at android.os.AsyncTask$2.call(AsyncTask.java:333) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at android.os .AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)在 java.lang.Thread.run(Thread.java:764) 2020-05-27 18:43:14.529 1022-1346/dev.jideguru.social_app_ui E/AndroidRuntime:致命异常:AsyncTask #6 进程:dev.jideguru。 social_app_ui, PID: 1022 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:353) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java: 383) 在 8821324694588 8.util.concurrent.FutureTask.setException(FutureTask.java:252) at java.util.concurrent.FutureTask.run(FutureTask.java:271) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245 ) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java: 764) Caused by: java.lang.AssertionError: INTERNAL ASSERTION FAILED: 调用更新回调后无法使用事务 object。 在 com.google.firebase.firestore.util.Assert.fail(com.google.firebase:firebase-firestore@@21.3.0:46) 在 com.google.firebase.firestore.util.Assert( .firebase:firebase-firestore@@21.3.0:31) 在 com.google.firebase.firestore.core.Transaction.ensureCommitNotCalled(com.google.firebase:firebase-firestore@@21.3.0:240.6)8 在 801google708 801 .firebase.firestore.core.Transaction.lookup(com.google.firebase:firebase-firestore@@21.3.0:81)在 com.google.firebase.firestore.Transaction.getAsync(com.google.8826046:65firebase57788 @@21.3.0:191) at com.google.firebase.firestore.Transaction.get(com.google.firebase:firebase-firestore@@21.3.0:228) at io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin$5. doInBackground(CloudFirestorePlugin.java:613)位于 io.flutter.plugins.firebase.cloudfirestor e.CloudFirestorePlugin$5.doInBackground(CloudFirestorePlugin.java:608) at android.os.AsyncTask$2.call(AsyncTask.java:333) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at android.os .AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)在 java.lang.Thread.run(Thread.java:764)

问题链接

Caused by: java.lang.AssertionError: INTERNAL ASSERTION FAILED: 事务 object 在其更新回调被调用后无法使用。

看起来事务在提交/取消后正在使用。

这是 FlutterFire 库中的一个已知问题,如开源存储库中的此问题所述。

此评论中提到了一个解决方法。 因此,您可以尝试将其应用于您的案例,提出修复错误的 PR,或者等到其他人修复它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM