我正在制作待办事项应用程序。 使用交易时,我有一个问题。
我尝试使用事务更改待办事项列表用户数。 但是由于某种原因,用户数却因两个活动而相互改变
所以,这就是代码
将用户添加到待办事项列表中
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
}
我担心交易崩溃。 如果某人被添加到待办事项列表中的用户计数,而同时又删除了另一个人在待办事项列表中的用户计数,则会导致事务崩溃或未反映该更改。 这样对吗?还是可以对一个文档使用双重交易?
如果有问题,如何在不中断彼此活动的情况下更改单个文档数据?
总是谢谢你。
答案 0 :(得分:0)
Firestore交易很乐观。在事务代码中,您首先阅读文档,然后确定新值,然后编写文档。 Firestore客户端会将读取的值和发送给服务器。然后,服务器将您读取的值与其所拥有的文档进行比较,并且仅在交易期间未修改文档的情况下才写入新值。
所有这些意味着,如果所有客户端都在使用事务,则无法正确覆盖文档。如果看到不正确的写操作,则可能要检查是否未在某处使用事务。