code: async def start(self):
          
          self.__check_state_base('start')
          if self._state is TransactionState.STARTED:
              raise apg_errors.InterfaceError(
                  'cannot start; the transaction is already started')
  
          con = self._connection
  
          if con._top_xact is None:
              if con._protocol.is_in_transaction():
                  raise apg_errors.InterfaceError(
                      'cannot use Connection.transaction() in '
                      'a manually started transaction')
              con._top_xact = self
          else:
              # Nested transaction block
              top_xact = con._top_xact
              if self._isolation != top_xact._isolation:
                  raise apg_errors.InterfaceError(
                      'nested transaction has a different isolation level: '
                      'current {!r} != outer {!r}'.format(
                          self._isolation, top_xact._isolation))
              self._nested = True
  
          if self._nested:
              self._id = con._get_unique_id('savepoint')
              query = 'SAVEPOINT {};'.format(self._id)
          else:
              if self._isolation == 'read_committed':
                  query = 'BEGIN;'
              elif self._isolation == 'repeatable_read':
                  query = 'BEGIN ISOLATION LEVEL REPEATABLE READ;'
              else:
                  query = 'BEGIN ISOLATION LEVEL SERIALIZABLE'
                  if self._readonly:
                      query += ' READ ONLY'
                  if self._deferrable:
                      query += ' DEFERRABLE'
                  query += ';'
  
          try:
              await self._connection.execute(query)
          except BaseException:
              self._state = TransactionState.FAILED
              raise
          else:
              self._state = TransactionState.STARTED
docs: Enter the transaction or savepoint block.