关于Yii2跨数据库postgresql批量操作数据使用嵌套事务碰到的问题

文章描述了一个使用Yii框架进行数据库操作的场景,涉及两个Postgresql数据库DB-1和manage之间的数据交互。在业务需求中,从DB-1的TableA-User获取数据,经过计算后插入到TableB-UserInfo,并删除源数据。整个过程在事务中进行,确保数据一致性。当出现异常时,事务会回滚以保持数据完整性。若存在嵌套事务,也采用相同方式进行提交和回滚。
摘要由CSDN通过智能技术生成

 在一些业务开发业务需求中,项目数据支撑由多个数据库(Postgresql)组成,业务要求从DB-1获取Table A-User,将数据计算后批量插入DB-1的Table B-UserInfo以及之后删除Table A-User的数据,Table B中的业务数据营业需要删除的场景:

DB-1连接配置如下,db.php  

       'shop'  => [
            'class'               => 'yii\db\Connection',
            'dsn'                 => 'pgsql:host=192.168.xx;dbname=shop;port=9543',
            'username'            => 'shop',
            'password'            => '123456',
            'charset'             => 'utf8',
            'enableSchemaCache'   => false,
            'enableProfiling'     => true,
            'schemaCacheDuration' => 0,
            'schemaCache'         => 'cache',
            'tablePrefix'         => 't_',
        ],
        'manage' => [
            'class'               => 'yii\db\Connection',
            'dsn'                 => 'pgsql:host=192.168.88.88;dbname=manage;port=9543',
            'username'            => 'manage',
            'password'            => '123456',
            'charset'             => 'utf8',
            'enableSchemaCache'   => false,
            'schemaCacheDuration' => 0,
            'schemaCache'         => 'cache',
            'tablePrefix'         => 'm_',
        ],

大概实现流程如下:

        ................       
        $tran      = Yii::$app->shop->beginTransaction();
        $manageTran = Yii::$app->manage->beginTransaction();
        try {
             
            
            $user = user::find()
                ->where(['=', 'phone', $phone])
                ->asArray()->one();
             
            $user     = $this->formatUser($data);
            $model    = new User();
            $model->setAttributes($sysUserInfo);
            if (!$model->save()) {
                throw new Exception($model->getMessage());
            }

             
            $data   = [
                'user_id'     => $model->id,
                 ................
            ];
            $manage = new ManageUser();
            $manage ->setScenario('add');
            $manage ->setAttributes($data);

            if (!$manage ->validate()) {
                throw new Exception($manage ->getMessage());
            }

            $tran->commit();
            $oauthTran->commit();
            ................     
        } catch (Exception $e) {
            $tran->rollBack();
            $manageTran->rollBack();
            throw new Exception($e ->getMessage());
            ................   
        }

 大致的结构及时这样的。

如果嵌套多层的话,比如内部某个方法里面有DB-1的事务,那么也是这样一层层事务提交/回滚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值