是否可以同时 运行 Firestore 和 Firebase-Storage 的事务和批量写入?
Is it possible to run Transactions and batched writes for Firestore and Firebase-Storage simultaneously?
用例: 我必须在 document_1 中写一些更新 document_2 并删除 document_3 并使用单个事务从 file_storage 中删除 file_4使用事务和批量写入。可能吗?如果可能怎么办?
注意:所有四个异步任务在完成时都应该成功,或者所有四个任务都应该失败。如果只读和写这个案例 Transactions and batched writes documentation 可以提供帮助。但在我们的例子中,也有文件读取-上传-删除任务。
Future<void> _runTransaction() async {
firestore.runTransaction((Transaction transaction) async {
final allDocs = await firestore.collection("messages").getDocuments();
final toBeRetrieved =
allDocs.documents.sublist(allDocs.documents.length ~/ 2);
final toBeDeleted =
allDocs.documents.sublist(0, allDocs.documents.length ~/ 2);
await Future.forEach(toBeDeleted, (DocumentSnapshot snapshot) async {
await transaction.delete(snapshot.reference);
});
await Future.forEach(toBeRetrieved, (DocumentSnapshot snapshot) async {
await transaction.update(snapshot.reference, {
"message": "Updated from Transaction",
"created_at": FieldValue.serverTimestamp()
});
});
});
await Future.forEach(List.generate(2, (index) => index), (item) async {
await firestore.runTransaction((Transaction transaction) async {
await Future.forEach(List.generate(10, (index) => index), (item) async {
await transaction.set(firestore.collection("messages").document(), {
"message": "Created from Transaction $item",
"created_at": FieldValue.serverTimestamp()
});
});
});
});
}
在撰写本文时,您无法在一个原子操作中包含对 Firestore 的写入操作和对 Cloud Storage 的写入操作。
正如您所提到的,您可以在 Firestore 中对 write/update/delete 操作使用批量写入,这将是原子的,但您不能包括对存储的写入。
您可以构建自己的机制,定期检查 Cloud Storage 中的每个文件是否在 Firestore 中有相应的配置(文档是否正确更新、删除等...),反之亦然。只是一个(非常)hacky 解决方法的建议...
用例: 我必须在 document_1 中写一些更新 document_2 并删除 document_3 并使用单个事务从 file_storage 中删除 file_4使用事务和批量写入。可能吗?如果可能怎么办?
注意:所有四个异步任务在完成时都应该成功,或者所有四个任务都应该失败。如果只读和写这个案例 Transactions and batched writes documentation 可以提供帮助。但在我们的例子中,也有文件读取-上传-删除任务。
Future<void> _runTransaction() async {
firestore.runTransaction((Transaction transaction) async {
final allDocs = await firestore.collection("messages").getDocuments();
final toBeRetrieved =
allDocs.documents.sublist(allDocs.documents.length ~/ 2);
final toBeDeleted =
allDocs.documents.sublist(0, allDocs.documents.length ~/ 2);
await Future.forEach(toBeDeleted, (DocumentSnapshot snapshot) async {
await transaction.delete(snapshot.reference);
});
await Future.forEach(toBeRetrieved, (DocumentSnapshot snapshot) async {
await transaction.update(snapshot.reference, {
"message": "Updated from Transaction",
"created_at": FieldValue.serverTimestamp()
});
});
});
await Future.forEach(List.generate(2, (index) => index), (item) async {
await firestore.runTransaction((Transaction transaction) async {
await Future.forEach(List.generate(10, (index) => index), (item) async {
await transaction.set(firestore.collection("messages").document(), {
"message": "Created from Transaction $item",
"created_at": FieldValue.serverTimestamp()
});
});
});
});
}
在撰写本文时,您无法在一个原子操作中包含对 Firestore 的写入操作和对 Cloud Storage 的写入操作。
正如您所提到的,您可以在 Firestore 中对 write/update/delete 操作使用批量写入,这将是原子的,但您不能包括对存储的写入。
您可以构建自己的机制,定期检查 Cloud Storage 中的每个文件是否在 Firestore 中有相应的配置(文档是否正确更新、删除等...),反之亦然。只是一个(非常)hacky 解决方法的建议...