Я пытаюсь реализовать несколько транзакций с одним и тем же документом в приложении 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 / Android Время выполнения: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: AsyncTask # 4 Процесс: dev.jideguru.social_app_ui, PID: 1022 java .lang.RuntimeException: произошла ошибка при выполнении doInBackground () в android .os.AsyncTask $ 3.done (AsyncTask. java: 353) в java .util.concurrent.FutureTask.finishCompletion (FutureTask. java: 383) в java .util.concurrent.FutureTask.setException (FutureTask. java: 252) в java .util.concurrent. FutureTask.run (FutureTask. java: 271) в android .os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask. java: 245) в java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1162) в java .rentutil.concur .ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor. java: 636) в java .lang.Thread.run (Thread. java: 764) Вызвано: java .lang.AssertionError: СБОЙ ВНУТРЕННЕГО УТВЕРЖДЕНИЯ: A объект транзакции нельзя использовать после того, как был вызван его обратный вызов обновления. на com.google.firebase.firestore.util.Assert.fail (com.google.firebase: firebase-firestore @@ 21.3.0: 46) на com.google.firebase.firestore.util.Assert.hardAssert (com.google .firebase: firebase-firestore @@ 21.3.0: 31) на com.google.firebase.firestore.core.Transaction.ensureCommitNotCalled (com.google.firebase: firebase-firestore @@ 21.3.0: 246) на com.google. .firebase.firestore.core.Transaction.lookup (com.google.firebase: firebase-firestore @@ 21.3.0: 81) по адресу com.google.firebase.firestore.Transaction.getAsyn c (com.google.firebase: firebase-firestore @@ 21.3.0: 191) на com.google.firebase.firestore.Transaction.get (com.google.firebase: firebase-firestore @@ 21.3.0: 228) на io.flutter.plugins.firebase. cloudfirestore.CloudFirestorePlugin $ 5.doInBackground (CloudFirestorePlugin. java: 613) в io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin $ 5.doInBackground (CloudFirestorePlugin. android: 2. (AsyncTask. java: 333) в java .util.concurrent.FutureTask.run (FutureTask. java: 266 ) в android .os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask. java: 245) в java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1162) в 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: произошла ошибка при выполнении doInBackground () в * 1056c * .os. $ 3.done (AsyncTask. java: 353) в java .util.concurrent.FutureTask.finishCompletion (FutureTask. java: 383) в java .util.concurrent.FutureTask.setException (FutureTask. java: 252) в java .util.concurrent.FutureTask.run (FutureTask. java: 271) в android .os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask. java: 245) в java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1162) в java .util.concurrent.ThreadPoolExecutor $ Worker.run (T hreadPoolExecutor. java: 636) at java .lang.Thread.run (Thread. java: 764) Вызвано: java .lang.AssertionError: СБОЙ ВНУТРЕННЕЙ АССЕРЦИИ: объект транзакции нельзя использовать после его Обратный вызов обновления был вызван. на com.google.firebase.firestore.util. Assert.fail (com.google.firebase: firebase-firestore @@ 21.3.0: 46) на com.google.firebase.firestore.util.Assert.hardAssert (com.google.firebase: firebase-firestore @@ 21.3.0 : 31) на com.google.firebase.firestore.core.Transaction.ensureCommitNotCalled (com.google.firebase: firebase-firestore @@ 21.3.0: 246) на com.google.firebase.firestore.core.Transaction.lookup ( com.google.firebase: firebase-firestore @@ 21.3.0: 81) на com.google.firebase.firestore.Transaction.getAsyn c (com.google.firebase: firebase-firestore @@ 21.3.0: 191) в com.google.firebase.firestore.Transaction.get (com.google.firebase: firebase-firestore @@ 21.3.0: 228) в io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin $ 5.doInBackground (CloudFirestore * 1074Plugin. *: 613) в io.flutter.plugins.firebase.cloudfirestore.CloudFirestorePlugin $ 5.doInBackground (CloudFirestorePlugin. java: 608) в android .os.AsyncTask $ 2.call (AsyncTask. java: 333) в 1078 * .util.concurrent.FutureTask.run (FutureTask. java: 266) в android .os.AsyncTask $ SerialExecuto r $ 1.run (AsyncTask. java: 245) в java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1162) в java .util.concurrent.ThreadPoolExecutor $ WorkerPool.run . java: 636) на java .lang.Thread.run (Thread. java: 764)
Ссылка на выпуск