在Firestore中可能有单笔交易发生双重交易吗?

时间:2019-10-15 10:53:00

标签: android kotlin transactions google-cloud-firestore

我正在制作待办事项应用程序。 使用交易时,我有一个问题。

我尝试使用事务更改待办事项列表用户数。 但是由于某种原因,用户数却因两个活动而相互改变

所以,这就是代码

将用户添加到待办事项列表中

val todoListRef = firestore!!.collection("todoList").document(intent.getStringExtra("checkList_name"))

firestore?.runTransaction { transaction ->
    var todoListDTO = transaction.get(todoListRef).toObject(TodoListDTO::class.java)
    if (todoListDTO == null) {
        todoListDTO = TodoListDTO()
        transaction.set(todoListRef, todoListDTO)
        return@runTransaction
    }

    if (!todoListDTO.todoListUsers.containsKey(currentUserUid!!)) {

        todoListDTO.todoListUserCount = todoListDTO.todoListUserCount + 1
        todoListDTO.todoListUsers[currentUserUid!!] = true
    }
    transaction.set(todoListRef, todoListDTO)
    return@runTransaction
}

在待办事项列表中删除用户

val todoListRef = firestore!!.collection("todoList").document(checkListName!!)

firestore?.runTransaction { transaction ->
    val todoListDTO = transaction.get(todoListRef).toObject(TodoListDTO::class.java)
    todoListDTO!!.todoListUserCount = todoListDTO.todoListUserCount - 1
    todoListDTO.todoListUsers.remove(currentUserUid!!)
    transaction.set(todoListRef, todoListDTO)

    return@runTransaction
}

我担心交易崩溃。 如果某人被添加到待办事项列表中的用户计数,而同时又删除了另一个人在待办事项列表中的用户计数,则会导致事务崩溃或未反映该更改。 这样对吗?还是可以对一个文档使用双重交易?

如果有问题,如何在不中断彼此活动的情况下更改单个文档数据?

总是谢谢你。

1 个答案:

答案 0 :(得分:0)

Firestore交易很乐观。在事务代码中,您首先阅读文档,然后确定新值,然后编写文档。 Firestore客户端会将读取的值发送给服务器。然后,服务器将您读取的值与其所拥有的文档进行比较,并且仅在交易期间未修改文档的情况下才写入新值。

所有这些意味着,如果所有客户端都在使用事务,则无法正确覆盖文档。如果看到不正确的写操作,则可能要检查是否未在某处使用事务。