Flatter firebase_数据库-DatabaseReference runTransaction-同步事务-两者都通过

Flatter firebase_数据库-DatabaseReference runTransaction-同步事务-两者都通过,firebase,flutter,firebase-realtime-database,Firebase,Flutter,Firebase Realtime Database,不知道如何简明扼要地命名这个问题,但问题就在这里 我正在使用我的Flatter应用程序中的firebase_数据库:^4.4.0 这是我的颤振医生-v输出: [✓] Flutter (Channel stable, 1.22.1, on Linux, locale en_ZA.UTF-8) • Flutter version 1.22.1 at /home/bob/snap/flutter/common/flutter • Framework revision f30b7f4db

不知道如何简明扼要地命名这个问题,但问题就在这里

我正在使用我的Flatter应用程序中的firebase_数据库:^4.4.0

这是我的
颤振医生-v
输出:

[✓] Flutter (Channel stable, 1.22.1, on Linux, locale en_ZA.UTF-8)
    • Flutter version 1.22.1 at /home/bob/snap/flutter/common/flutter
    • Framework revision f30b7f4db9 (10 weeks ago), 2020-10-08 10:06:30 -0700
    • Engine revision 75bef9f6c8
    • Dart version 2.10.1

  [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
    • Android SDK at /home/bob/Android/Sdk
    • Platform android-30, build-tools 30.0.2
    • Java binary at: /usr/local/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
    • All Android licenses accepted.

[✓] Android Studio (version 4.0)
    • Android Studio at /usr/local/android-studio
    • Flutter plugin version 50.0.1
    • Dart plugin version 193.7547
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)

[✓] Connected device (3 available)
    • SM A510F (mobile)       • NOPE             • android-arm   • Android 7.0 (API 24)
    • SM A205F (mobile)       • NOPE2            • android-arm64 • Android 10 (API 29)
    • sdk gphone x86 (mobile) • emulator-5554    • android-x86   • Android 11 (API 30) (emulator)

• No issues found!
在应用程序的一部分中,存在两个用户可以同时更新同一文档的可能性,或者更准确地说,可以更新文档的“状态”值:
{“状态”:“foo”}

为了防止可能的争用情况,Firebase建议使用如下事务(按下按钮时调用):

有两台设备(两个不同的FireBase用户,顺便说一句)打开应用程序并同时按下按钮会导致两个应用程序导航到下一页,而只有第一个成功更改状态的应用程序会被删除。在下一页,当前用户也将添加到文档中

然而,在按下按钮时延迟一秒钟只会导致第一个按钮进入下一页,因此代码可以正常工作,但我只需要进行一次更新,以便第一次状态更改只能导航到下一页

或者,我可以只检查一个用户是否已添加到文档中,如果已经有一个用户,请阻止第二个用户继续,但这感觉不对吗

也许我做错了?如有任何建议,将不胜感激

编辑:所以我尝试通过检查是否有用户添加到文档中来“捕获”导航页面上的第二个用户,即

myRef.child("user").once().then((DataSnapshot snapshot) {
          if (snapshot.value == null) {
            myRef.child('user').set(username);
          }
    }
但这实际上只是将竞赛条件转移到下一页

myRef.child("user").once().then((DataSnapshot snapshot) {
          if (snapshot.value == null) {
            myRef.child('user').set(username);
          }
    }