code: def end_data_item_live(self, data_item):
          
          with self.__live_data_items_lock:
              live_count = self.__live_data_items.get(data_item.uuid, 0) - 1
              assert live_count >= 0
              self.__live_data_items[data_item.uuid] = live_count
          if live_count == 0:
              data_item._exit_live_state()
              for dependent_data_item in self.get_dependent_data_items(data_item):
                  self.end_data_item_live(dependent_data_item)
docs: Ends a live state for the data item.
  
          The live-ness property is propagated to dependent data items, similar to the transactions.
  
          This method is thread safe.