code: protected function internalExecute($rawSql)
      {
          $attempt = 0;
          while (true) {
              try {
                  if (
                      ++$attempt === 1
                      && $this->_isolationLevel !== false
                      && $this->db->getTransaction() === null
                  ) {
                      $this->db->transaction(function () use ($rawSql) {
                          $this->internalExecute($rawSql);
                      }, $this->_isolationLevel);
                  } else {
                      $this->pdoStatement->execute();
                  }
                  break;
              } catch (\Exception $e) {
                  $rawSql = $rawSql ?: $this->getRawSql();
                  $e = $this->db->getSchema()->convertException($e, $rawSql);
                  if ($this->_retryHandler === null || !call_user_func($this->_retryHandler, $e, $attempt)) {
                      throw $e;
                  }
              }
          }
      }
docs: Executes a prepared statement.
  
  It's a wrapper around [[\PDOStatement::execute()]] to support transactions
  and retry handlers.
  
  @param string|null $rawSql the rawSql if it has been created.
  @throws Exception if execution failed.
  @since 2.0.14