driver() === 'mysql' && $connection->getProvider() === 'mysql')) { return []; } $query = 'SELECT @@SESSION.tx_isolation'; // The database variable "tx_isolation" has been removed in MySQL v8.0.3 and // has been replaced by "transaction_isolation". // @see https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_tx_isolation // @see https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html if (!$connection->isMariaDb() && version_compare($connection->version(), '8.0.2-AnyName', '>')) { $query = 'SELECT @@SESSION.transaction_isolation'; } $isolation_level = $connection->query($query)->fetchField(); $tables_missing_primary_key = []; $tables = $connection->schema()->findTables('%'); foreach ($tables as $table) { $primary_key_column = Database::getConnection()->query("SHOW KEYS FROM {" . $table . "} WHERE Key_name = 'PRIMARY'")->fetchAllAssoc('Column_name'); if (empty($primary_key_column)) { $tables_missing_primary_key[] = $table; } } $description = []; if ($isolation_level == 'READ-COMMITTED') { if (empty($tables_missing_primary_key)) { $severity_level = REQUIREMENT_OK; } else { $severity_level = REQUIREMENT_ERROR; } } else { if ($isolation_level == 'REPEATABLE-READ') { $severity_level = REQUIREMENT_WARNING; } else { $severity_level = REQUIREMENT_ERROR; $description[] = t('This is not supported by Drupal.'); } $description[] = t('The recommended level for Drupal is "READ COMMITTED".'); } if (!empty($tables_missing_primary_key)) { $description[] = t('For this to work correctly, all tables must have a primary key. The following table(s) do not have a primary key: @tables.', ['@tables' => implode(', ', $tables_missing_primary_key)]); } $description[] = t('See the setting MySQL transaction isolation level page for more information.', [ ':performance_doc' => 'https://www.drupal.org/docs/system-requirements/setting-the-mysql-transaction-isolation-level', ]); $requirements['mysql_transaction_level'] = [ 'title' => t('Transaction isolation level'), 'severity' => $severity_level, 'value' => $isolation_level, 'description' => Markup::create(implode(' ', $description)), ]; } } return $requirements; }