美文网首页Laravel开发实践
MySQL数据库事务分别在原生PHP、Laravel5.4和Th

MySQL数据库事务分别在原生PHP、Laravel5.4和Th

作者: 平常xin | 来源:发表于2017-11-29 22:30 被阅读127次

    转载请务必保留超链接 :原文链接   

    前言

    为什么写这篇blog?

    1:自己对MySQL事务做一次复盘

    2:分享给各位同行,在项目如何使用MySQL事务

    一:MySQL数据库的事务是什么?

    MySQL数据库的事务(Transaction)是一组SQL组成的执行单元, 是数据库并发控制和恢复回滚的基本单位。接地气的描述:可以理解为单个表或者多个表的write操作同时成功或者同时失败。

    二:怎么用?

    分别在原生PHP、Laravel5.4和ThinkPHP3.2中使用MySQL数据库事务的例子:

    1:原生MySQL的例子:A用户给B用户转账

    mysql_query('START TRANSACTION'); //开启一个事务

    $res1 = mysql_query(update table set money=money-1 where id =)

    $res2 = mysql_query(update table set money=money+1 where id =)

    if($res1 && $res2){

        //成功之后提交

        mysql_query('COMMIT');   

    }else{

        //失败之后回滚

        mysql_query('ROLLBACK'); 

    }

    2:在Laravel5.4中使用MySQL数据库事务

    Laravel5.4关于事务操作的网址:http://laravelacademy.org/post/6947.html

    //业务逻辑:两个表的insert操作

    DB::beginTransaction();

    try{

        //业务处理和事务提交

        $data['name']  = 'test_name';

        $data['age']  = 25;

        $getGroupId = DB::table('db_name.table_name1')->insertGetId($data);

        foreach($list_data as $v) {

            DB::table('db_name.table_name2')->insert([

            'group_id' => $getGroupId,

            'name'      => $v['name']

        ]);

        }

      //成功之后提交

        DB::commit();

    } catch (\Exception $exception) {

        //接收异常处理并回滚和抛出异常

        DB::rollBack();

        throw new \Exception('操作失败!');

    }

    3:在ThinkPHP3.2使用MySQL数据库事务

    //业务逻辑:两个表的update操作

    $modelRefund = D('Home/OrderRefund');

    $modelDetail =  D('Home/OrderDetail');

    //启动事务

    $modelRefund->startTrans();

    $refund_status = 1;

    $updateRefundRes = $modelRefund->saveRefundStatus($where,$refund_status);

    $status=6;

    foreach($order_detail as $k => $v){

        $where['id'] = $v;

        $updateDetailRes = $modelDetail->saveDetailCompleteStatus($where,$status);

    }

    if($updateRefundRes && $updateDetailRes){

        //事务提交

        $modelRefund->commit();

        $this->success(C('OPERA_SUCCESS'));exit;

    }else{

      //事务回滚

        $modelRefund->rollback();

        $this->error(C('OPERA_FAILD'));exit;

    }

    三:有什么作用

    避免数据丢失,可以保证数据一致性;

    总结:MySQL数据库事务,数据表引擎必须是支持事务的引擎,比如InnoDB、TokuDB、MyRocks;一个事务可以包含多个SQL,该SQL的执行状态要么都成功,要么都失败。

    相关文章

      网友评论

        本文标题:MySQL数据库事务分别在原生PHP、Laravel5.4和Th

        本文链接:https://www.haomeiwen.com/subject/ujqmbxtx.html