Firebase 트랜잭션은 해당 경로에 데이터가 있어도 경로에서 null을 읽습니다.

Dec 22 2020

Firebase 트랜잭션이 때때로 데이터를 null로 읽지 만 서버에서 값을 가져와 커밋 할 때까지 루프가 다시 실행된다는 것을 이해합니다. 그러나 트랜잭션이 null 데이터를 읽고 null의 경우 반환하는 값을 커밋하는 독특한 상황에 직면하고 있습니다. 첨부 된 코드를보세요.

 deductTransaction.transaction((current_value) => {
       if (current_value != null) {
           return current_value - cost;
       }
       return 25;
   });

위의 코드에서 "deductTransaction"은 업데이트하려는 데이터 (숫자)의 경로입니다.

위의 코드는 어떤 경우에는 잘 실행됩니다. 즉, null을 읽은 경우 루프가 다시 실행되고 때로는 한 번만 실행되고 해당 경로에 데이터가 있어도 값을 null로 읽은 다음 25를 커밋하여 원래 데이터를 파괴합니다.

추신 : 나는 내 머리카락을 잡아 당기기에 가깝기 때문에 도움을 주시면 감사하겠습니다.

답변

1 FrankvanPuffelen Dec 22 2020 at 20:48

한 위치에서 트랜잭션을 실행하면 해당 위치에서 클라이언트가 현재 추측 한 값으로 콜백 / 핸들러가 즉시 호출됩니다. 대부분의 경우 현재 값의 초기 추측은입니다 null.

핸들러는이 상황을 처리해야합니다. 따라서 해당 위치에 데이터가없고 비용을 공제하고 싶다면 어떻게됩니까? 일반적으로 반환 -25하거나 트랜잭션을 중단하라고 지시합니다.

어느 쪽이든 : 초기 추측 값과 새 값이 데이터베이스 서버로 전송되어 초기 추측 값이 잘못되었음을 감지하고 현재 값을 호출자에게 반환합니다. 그런 다음 SDK는 현재 값에 대한 최선의 추측으로 핸들러 / 콜백을 다시 호출합니다.

참조 :

  • Firebase 실시간 데이터베이스 트랜잭션 핸들러는 대부분의 시간에 두 번 호출됩니다 (위의 흐름 다이어그램 포함).
  • Firebase runTransaction이 작동하지 않음-MutableData가 null입니다.
  • Firebase의 충돌 해결 이해
  • Firebase 트랜잭션의 currentData가 항상 nil 인 이유는 무엇입니까?

참고 : 요즘에는 increment연산자 를 사용하여 트랜잭션없이 증가 및 감소 작업을 수행 할 수 있습니다 . 이렇게하면 코드가 상당히 간단 해지며 Firebase 실시간 데이터베이스 에서 얼마나 빨리 값을 원자 적으로 증가시킬 수 있습니까?에 나와있는 것처럼 성능이 향상됩니다 . .

비교를 위해 increment연산자는 0위치에 값이없는 경우 현재 값을 가정합니다 .