使用表前缀
如果你的数据库表名大多都拥有一个共同的前缀, 你可以使用 Yii DAO 所提供的表前缀功能。
首先,通过应用配置中的 yii\db\Connection::$tablePrefix 属性来指定表前缀:
https://www.modb.pro/db/625158#31-%E6%A6%82%E8%A6%81
https://www.cnblogs.com/ywdba668/p/18533265
return [
// ...
'components' => [
// ...
'db' => [
// ...
'tablePrefix' => 'tbl_',
],
],
];
接着在你的代码中,当你需要涉及到一张表名中包含该前缀的表时, 应使用语法 {{table_name}}。百分号将被自动地替换为你在配置 DB 组件时指定的表前缀。 例如,
// 在 MySQL 中执行该 SQL: SELECT COUNT(id) FROM tbl_employee
$count = Yii::$app->db->createCommand("SELECT COUNT([[id]]) FROM {{employee}}")
->queryScalar();
指定隔离级别
Yii 也支持为你的事务设置隔离级别。默认情况下,当我们开启一个新事务, 它将使用你的数据库所设定的隔离级别。你也可以向下面这样重载默认的隔离级别,
$isolationLevel = \yii\db\Transaction::REPEATABLE_READ;
Yii::$app->db->transaction(function ($db) {
....
}, $isolationLevel);
// or alternatively
$transaction = Yii::$app->db->beginTransaction($isolationLevel);
Yii 为四个最常用的隔离级别提供了常量:
yii\db\Transaction::READ_UNCOMMITTED - 最弱的隔离级别,脏读、不可重复读以及幻读都可能发生。
yii\db\Transaction::READ_COMMITTED - 避免了脏读。
yii\db\Transaction::REPEATABLE_READ - 避免了脏读和不可重复读。
yii\db\Transaction::SERIALIZABLE - 最强的隔离级别, 避免了上述所有的问题。
除了使用上述的常量来指定隔离级别,你还可以使用你的数据库所支持的具有有效语法的字符串。 比如,在 PostgreSQL 中,你可以使用 SERIALIZABLE READ ONLY DEFERRABLE。
请注意,一些数据库只允许为整个连接设置隔离级别, 即使你之后什么也没指定,后来的事务都将获得与之前相同的隔离级别。 使用此功能时,你需要为所有的事务明确地设置隔离级别来避免冲突的设置。 在本文写作之时,只有 MSSQL 和 SQLite 受这些限制的影响。
注意: SQLite 只支持两种隔离级别,所以你只能使用 READ UNCOMMITTED 和 SERIALIZABLE。 使用其他级别将导致异常的抛出。
注意: PostgreSQL 不支持在事务开启前设定隔离级别, 因此,你不能在开启事务时直接指定隔离级别。 你必须在事务开始后再调用 yii\db\Transaction::setIsolationLevel()。
复制和读写分离
许多数据库支持数据库复制来获得更好的数据库可用性, 以及更快的服务器响应时间。通过数据库复制功能, 数据从所谓的主服务器被复制到从服务器。所有的写和更新必须发生在主服务器上, 而读可以发生在从服务器上。
为了利用数据库复制并且完成读写分离, 你可以按照下面的方法来配置 yii\db\Connection 组件:
[
'class' => 'yii\db\Connection',
// 主库的配置
'dsn' => 'dsn for master server',
'username' => 'master',
'password' => '',
// 从库的通用配置
'slaveConfig' => [
'username' => 'slave',
'password' => '',
'attributes' => [
// 使用一个更小的连接超时
PDO::ATTR_TIMEOUT => 10,
],
],
// 从库的配置列表
'slaves' => [
['dsn' => 'dsn for slave server 1'],
['dsn' => 'dsn for slave server 2'],
['dsn' => 'dsn for slave server 3'],
['dsn' => 'dsn for slave server 4'],
],
]
上述的配置指定了一主多从的设置。 这些从库其中之一将被建立起连接并执行读操作,而主库将被用来执行写操作。 这样的读写分离将通过上述配置自动地完成。比如,
// 使用上述配置来创建一个 Connection 实例
Yii::$app->db = Yii::createObject($config);
// 在从库中的一个上执行语句
$rows = Yii::$app->db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();