Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果在批处理操作中使用Firestore increment,是否会产生与事务相同的结果?_Java_Firebase_Google Cloud Firestore - Fatal编程技术网

Java 如果在批处理操作中使用Firestore increment,是否会产生与事务相同的结果?

Java 如果在批处理操作中使用Firestore increment,是否会产生与事务相同的结果?,java,firebase,google-cloud-firestore,Java,Firebase,Google Cloud Firestore,我不知道如何以原子方式使用Firestore增量。我有点困惑 我的文档中有容量作为字段。同时用户可以通过更新文档来增加或减少容量的值。在更新的同时,用户还需要创建一些文档。以前我使用事务来确保创建和更新操作 所以之前我使用firestore事务来确保这些操作要么所有操作都成功,要么所有操作都失败 但现在我想使用Firebase增量和批处理操作,如下所示 val batch = FirebaseFirestore.getInstance().batch() //

我不知道如何以原子方式使用Firestore增量。我有点困惑

我的文档中有
容量
作为字段。同时用户可以通过更新文档来增加或减少
容量的值。在更新的同时,用户还需要创建一些文档。以前我使用事务来确保创建和更新操作

所以之前我使用firestore事务来确保这些操作要么所有操作都成功,要么所有操作都失败

但现在我想使用Firebase增量和批处理操作,如下所示

        val batch = FirebaseFirestore.getInstance().batch()

        // 1. set event data in liked events subcollection
        val ref1 = FirestoreDocumentReference.user.getReference(user.uid).collection("likedEvents").document(likedEvent.eventID)
        val savedData1 : HashMap<String,Any> = hashMapOf(
            FIRESTORE_EVENT_FIELD_EVENT_ID to likedEvent.eventID,
            FIRESTORE_EVENT_FIELD_TITLE to likedEvent.title,
            FIRESTORE_EVENT_FIELD_VENUE to likedEvent.venue,
            FIRESTORE_EVENT_FIELD_DATE_START_TIME to likedEvent.dateTimeStart,
            FIRESTORE_EVENT_FIELD_THUMBNAIL_DOWNLOAD_PATH to likedEvent.thumbnailDownloadPath,
            FIRESTORE_EVENT_FIELD_CREATED_AT to Calendar.getInstance().time
        )
        batch.set(ref1,savedData1)



        // 2. update the rankPoint and capacity of event
        val updateData : MutableMap<String,Any> = mutableMapOf(
            FIRESTORE_EVENT_FIELD_RANKPOINT to FieldValue.increment(5),
            FIRESTORE_EVENT_FIELD_CAPACITY to FieldValue.increment(-1)
        )
        val ref2 = FirestoreDocumentReference.event.getReference(likedEvent.eventID)
        batch.update(ref2,updateData)


        batch.commit().addOnSuccessListener {
            completion(true,null)
        }.addOnFailureListener { e ->
            completion(false,e.localizedMessage)
        }
val batch=FirebaseFirestore.getInstance().batch()
// 1. 在“喜欢的事件”子集合中设置事件数据
val ref1=FirestoreDocumentReference.user.getReference(user.uid).collection(“likedEvents”).document(likedEvent.eventID)
val savedData1:HashMap=hashMapOf(
FIRESTORE\u事件\u字段\u事件\u ID为likedEvent.eventID,
FIRESTORE\u事件\u字段\u标题为likedEvent.TITLE,
FIRESTORE\u事件\u现场\u地点,如事件地点,
FIRESTORE\u事件\u字段\u日期\u开始时间\u喜欢的时间EVENT.dateTimeStart,
FIRESTORE\u事件\u字段\u缩略图\u下载路径到likeEvent.thumbnailDownloadPath,
FIRESTORE\u事件\u字段\u创建时间\u到Calendar.getInstance().time
)
batch.set(参考1,savedData1)
// 2. 更新事件的rankPoint和容量
val updateData:MutableMap=mutableMapOf(
FIRESTORE_事件_字段_从点到字段值。增量(5),
FIRESTORE\u事件\u字段\u容量到字段值。增量(-1)
)
val ref2=FirestoreDocumentReference.event.getReference(likeEvent.eventID)
batch.update(参考文献2,updateData)
batch.commit().addOnSuccessListener{
完成(true,null)
}.addOnFailureListener{e->
完成(假,如本地化消息)
}
如果我这样做,是否会得到与使用事务更新
capacity
相同的结果

我必须确保两件事:

  • 如果某些用户更新容量值,则容量值更新不会重叠 同时提供容量值
  • 创建和更新操作必须全部成功,否则全部失败

批写入操作在服务器上以事务方式执行

批写入和事务之间的区别在于,在事务中,在将数据和更新的值发送到服务器之前,您首先在客户机上获取文档数据。在批写入中,您只需将所有更新发送到服务器,而不首先获取任何值。由于
FieldValue.increment()
允许在客户端不首先读取数值字段值的情况下更改数值字段,因此这可以在批处理操作中安全地完成

所以:是的,更新要么全部发生,要么全部不发生。而且在增量上不可能出现比赛条件