Flatter firebase_数据库-DatabaseReference runTransaction-同步事务-两者都通过
不知道如何简明扼要地命名这个问题,但问题就在这里 我正在使用我的Flatter应用程序中的firebase_数据库:^4.4.0 这是我的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
颤振医生-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);
}
}