默认情况下,事务使用主库连接, 一个事务内,所有的数据库操作都将使用主库连接,例如,
$db = Yii::$app->db;
// 在主库上启动事务
$transaction = $db->beginTransaction();
try {
// 两个语句都是在主库上执行的
$rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();
$db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();
$transaction->commit();
} catch(\Exception $e) {
$transaction->rollBack();
throw $e;
} catch(\Throwable $e) {
$transaction->rollBack();
throw $e;
}
如果你想在从库上开启事务,你应该明确地像下面这样做:
$transaction = Yii::$app->db->slave->beginTransaction();
$transaction= Yii::$app->db->beginTransaction();
try {
$db = Yii::$app->db;
if (!$model->save())
return ['status' => 8002, 'message' => ToolBase::sqlError($model->errors)];
if ($status == 9 || $status == 10) {
$standardLog_sqlHead = "INSERT INTO `pss_standard_log` (`id`,`status`) VALUES";
$sql10 = $standardLog_sqlHead . join(',',$standardLog_value). "ON DUPLICATE KEY UPDATE status = VALUES(status)";
$db->createCommand($sql10)->execute();
$simpleWarehouse_sqlHead = "INSERT INTO `pss_simple_warehouse` (`simple_id`,`warehouse_id`,`num`) VALUES";
$sql11 = $simpleWarehouse_sqlHead . join(',',$simpleWarehouse_value) . "ON DUPLICATE KEY UPDATE num = VALUES(num)";
$db->createCommand($sql11)->execute();
}
$transaction->commit();
} catch(\Exception $e) {
$transaction->rollBack();
return ['status'=>8002,'message'=>"$e"];
}