TP5事务操作简明实例

 

一、使用场景:

如果一个操作会改变数据库多处信息,并且这些信息是密切相关的,

为了确保每一处改动都是成功的,如果其中一处改动不成功,就将其它改动撤销,以保证数据(事务)的完整性。

比如:你给我转账10000块,需要把你的余额减10000,我的加10000,如果万一我的余额写入失败,那么理应你的余额不变,

不然这10000就蒸发了~~

 

二、简明实例:

需要数据库引擎支持事务处理。

比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎。

实例:


        try {

            Db::startTrans();

            //将数据1存入表1,并获取ID:
            $re['t1'] = Db::name('table1')
                ->insertGetId([
                    'content1' => $content1
                ]);

            //将数据2写入表2
            $re['t2'] = Db::name('table2')
                ->insert([
                    'id' => $re['t1'],
                    'content2' => $content2
                ]);

            //任意一个表写入失败都会抛出异常:
            if (in_array('0', $re)) {        
                throw new Exception('意不意外?');
            }

            Db::commit();
            $this->success('完美一击!');

        } catch (Exception $e) {
            //如获取到异常信息,对所有表的删、改、写操作,都会回滚至操作前的状态:
            Db::rollback();
            $this->error($e);

        }

 

三、注意事项:

1、事务操作与foreach循环一起使用时,循环应该放在事务中,而不是将事务放在循环中。

错误实例:


        $test = ['东', '南', '西', '北'];
        foreach ($test as $v) {
            try {
                Db::startTrans();

                if ($v == '西') continue;
                dump($v);

                Db::commit();
                halt(6);
            } catch (Exception $e) {
                Db::rollback();
                halt(9);
            }
        }

结果不符预期:

TP5事务操作简明实例_第1张图片

正确实例:


        $test = ['东', '南', '西', '北'];
        try {
            Db::startTrans();

            foreach ($test as $v) {
                if ($v == '西') continue;
                dump($v);
            }

            Db::commit();
            halt(6);
        } catch (Exception $e) {
            Db::rollback();
            halt(9);
        }

结果符合预期:

TP5事务操作简明实例_第2张图片

 

如有任何疑议,欢迎大家留言探讨、指正,谢谢~

如此文章对你有帮助,请打开支付宝搜索535149388,领取马云的红包,使用余额宝消费可抵扣,大家好,才是真的好。

更多精彩内容请扫码关注:

TP5事务操作简明实例_第3张图片 问虎网络

 

你可能感兴趣的:(TP5)