MySQL,MariaDB和等效数据库的默认事务隔离级别是“REPEATABLE READ”。使用 Drupal 的此设置可能会导致表上的死锁,这将导致站点变得非常慢或根本没有响应。
Drupal站点的推荐事务隔离级别是“READ COMMITTED”。支持“可重复读取”选项,但可能会导致死锁,其他 2 个选项是“读取未提交”和“可序列化”。它们可用但不受支持;使用它们的风险由您自己承担。
Drupal将在状态报告页面上生成警告(当MySQL,MariaDB或等效数据库使用事务隔离级别设置为“可重复读取”时)。admin/reports/status)
如果站点需要将事务隔离级别显式设置为“读取提交”,则可以使用两种方法:
更改事务隔离级别的首选方法
第一种方法是运行数据库查询,该查询为数据库上的每个会话设置事务隔离级别。查询为:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED
此查询只能由具有超级用户权限的数据库用户运行。
您可以通过运行下面的 mysql 命令来检查是否已设置值。
更改事务隔离级别的替代方法
第二种方法是更新文件。该文件的默认位置为 。该文件是在安装Drupal站点期间创建的。settings.phpsites/default/settings.php
文件末尾通常是找到的数据库连接数组。像这样:settings.php
$databases['default']['default'] = array(
'database' => 'databasename',
'username' => 'sqlusername',
'password' => 'sqlpassword',
'host' => 'localhost',
'driver' => 'mysql',
'prefix' => '',
'port' => '3306',
);
要将数据库事务隔离级别更改为“读取提交”,请将以下内容添加到数据库连接数组中:
'init_commands' => [
'isolation_level' => 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
],
添加设置的数据库连接数组将如下所示:
$databases['default']['default'] = array(
'database' => 'databasename',
'username' => 'sqlusername',
'password' => 'sqlpassword',
'host' => 'localhost',
'driver' => 'mysql',
'prefix' => '',
'port' => '3306',
'init_commands' => [
'isolation_level' => 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
],
);
要确认设置是否正确,您可以运行 mysql 命令:
show variables WHERE Variable_name LIKE "%_isolation";
应会看到以下输出:
mysql> show variables WHERE Variable_name LIKE "%isolation";
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+-----------------+
1 row in set (0.00 sec)
有关隔离级别的更多信息,请参阅 MySQL 事务隔离级别文档。
评论