![](/img/trans.png)
[英]Regarding transactions in Firestore, if I write to the same document multiple times, will those operations get flattened to a single write?
[英]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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.