async def METHOD_NAME(self, f1, f2, options=None):
    con2 = await self.connect(database=self.get_database_name())
    self.addCleanup(con2.aclose)
    barrier = Barrier(2)
    lock = asyncio.Lock()
    iterations = 0
    async def transaction1(con, f):
        async for tx in con.retrying_transaction():
            nonlocal iterations
            iterations += 1
            held = False
            try:
                async with tx:
                    # Run SELECT 1 to actually start the transaction.
                    await tx.query("SELECT 1")
                    # Start both transactions at the same initial data.
                    await barrier.ready()
                    await lock.acquire()
                    held = True
                    res = await f(tx)
            finally:
                if held:
                    lock.release()
                    held = False
        return res
    con = self.con
    if options:
        con = con.with_retry_options(options)
        con2 = con2.with_retry_options(options)
    results = await asyncio.wait_for(asyncio.gather(
        transaction1(con, f1),
        transaction1(con2, f2),
        return_exceptions=True,
    ), 10)
    for e in results:
        if isinstance(e, BaseException):
            raise e
    return results, iterations