欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ThinkPHP数据库驱动之mysql事物回滚

程序员文章站 2022-05-22 16:46:03
1、开启事务方法 startTrans()2、事务提交方法 commit()3、事务回滚方法 rollback() 用法例子: 如果commit了。那么就提交插入数据。如果发现alladded为假说明有条数据没插入正确。那么就rollback回滚就会取消事物开启之后操作数据库的所有行为。 提供一个例 ......

1、开启事务方法 starttrans()
2、事务提交方法 commit()
3、事务回滚方法 rollback()

用法例子:

$order = m(‘order’);
$alladded = true; //先设定一个值为 true;
$data['name'] = 'winter';
$order->starttrans(); //开启事物
for($i = 1;$i<3;$i++){ 
    $sign = $order->add($data); //添加一条数据到order表
    if(!$sign){
        $order->rollback(); //如果order添加失败事物回滚
        $alladded = false; //并且把alladded设置为 false
    }
}
//回滚
if($alladded){
    $order->commit(); 
    // 如果alladded为真则两条数据都成功;那么 commit事物提交
    echo '添加成功';
}else{
    echo '添加失败';
}

如果commit了。那么就提交插入数据。如果发现alladded为假说明有条数据没插入正确。那么就rollback回滚就会取消事物开启之后操作数据库的所有行为。

提供一个例子助于大家加深理解

public function insertdata(){
    $model = m();
    $model->starttrans();
    $data['name'] = 'winter';
//增加一条用户信息
    $si = $model->table(c('db_prefix').'user')->add($data);
    if(!$si){
        $model->rollback();
        exit();
    }
    $car['brand'] = $si;
//增加一条用户id
    $c = $model->table(c('db_prefix').'car')->add($car);
    if($si && $c){
        $model->commit();
    }else{
        $model->rollback();
    }
}
复制代码

 例子二:

//提现操作
    public function ajax_tx()
    {
         //判断是否登录
        if(session('uid') == null || session('uid') == "" || session('uid') == false) {
           echo "300";
            exit;
        }else{
            //接受提现提交来的数据
            
            $txnumber = intval(trim($_post['txnumber']));

            $name = trim($_post['name']);
            $alipay_number = trim($_post['alipay_number']);
            $data = m("fanxian_new")->where("f_uid='".session('uid')."'")->find();
            if(empty($txnumber)){
                echo "301";exit;//提现金豆不能为空
            }else{
                if(empty($data) || intval($data['f_fan_fee'])==0){
                    echo "302";exit;//无可提现金豆
                }else{
                    if($data['f_fan_fee']<number_format($txnumber,2)){
                        echo "303";exit;//提现金豆数请勿大于持有金豆数
                    }else{
                        if(empty($alipay_number)){
                            echo "304";exit;//提现者支付宝账号不能为空
                        }
                        if(empty($name)){
                            echo "305";exit;//提现者真实姓名不能为空
                        }

                        $model=new \think\model();
                        $model->starttrans(); //开启事物
                        //操作提现记录
                        $fanxian_new_log = m("fanxian_new_log");
                        $fanxian_new_log->f_num_fee = number_format($txnumber,2);
                        $fanxian_new_log->f_lmid = session("uid");
                        $fanxian_new_log->f_create_time = time();
                        $fanxian_new_log->f_name = $name;
                        $fanxian_new_log->f_alipay = $alipay_number;
                        $fanxian_new_log->f_status = 1;//1表示提现记录 0表示返现记录
                        $jdtx = $fanxian_new_log->add();

                        $fanxian_new = m("fanxian_new");
                        $fanxian_new->f_uid    = $data['f_uid'];
                        $fanxian_new->f_fan_fee = $data['f_fan_fee']-number_format($txnumber,2);
                        $jd = $fanxian_new->save();
                        if(!empty($jdtx) && !empty($jd)){
                            //提交
                            $model->commit();
                            echo "200";exit;//提现成功
                        }else{
                            //回滚
                            $model->rollback();
                            echo "306";exit;//提现失败
                        }
                        
                    }
                }
            }
            
        }
    }