code: async def transaction(self, func, *watches, **kwargs):
          
          shard_hint = kwargs.pop('shard_hint', None)
          value_from_callable = kwargs.pop('value_from_callable', False)
          watch_delay = kwargs.pop('watch_delay', None)
          async with await self.pipeline(True, shard_hint) as pipe:
              while True:
                  try:
                      if watches:
                          await pipe.watch(*watches)
                      func_value = await func(pipe)
                      exec_value = await pipe.execute()
                      return func_value if value_from_callable else exec_value
                  except WatchError:
                      if watch_delay is not None and watch_delay > 0:
                          await asyncio.sleep(
                              watch_delay,
                              loop=self.connection_pool.loop
                          )
                      continue
docs: Convenience method for executing the callable `func` as a transaction
          while watching all keys specified in `watches`. The 'func' callable
          should expect a single argument which is a Pipeline object.