yii中事务Transaction()与try...catch....结合使用

默认情况下,事务使用主库连接, 一个事务内,所有的数据库操作都将使用主库连接,例如,

$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"];
            }

猜你喜欢

转载自blog.csdn.net/qq_33876293/article/details/82866722
今日推荐