美文网首页
关于 tp5 事务操作总结

关于 tp5 事务操作总结

作者: mike_lp | 来源:发表于2019-08-12 19:00 被阅读0次

前提:

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

事务操作

使用场景

    Db::startTrans();
    try{
        Db::name('users')->insert(array('name'=>'mike','age'=>28));
         Db::name('products')->where('id','=',1)->update(array('status'=>2));       
        Db::commit();
        return json_return("事务操作成功");      // json_return() 为封装返回json数据的方法
    }catch (\Exception $e){
        Db::rollback();
        return json_return($e->getMessage());      // json_return() 为封装返回json数据的方法
    }

针对事务操作,我们首先需要了解事务的意义:这里不详述了,不清楚的朋友可参考 MySQL事务 进行了解。

常见问题

  • 问题1:如上代码中如果第一条新增语句 返回 true , 第二条更新语句返回 false ,那这个事务还是会 commit 的,而不是我们预期的rellback,这是为什么?

     如果想让两条 sql 真正按照自己的意愿都 "执行成功(都返回 true 时)" 时再提交事务,那需要这样写:
      Db::startTrans();
      try{
          $res1 = Db::name('users')->insert(array('name'=>'mike','age'=>28));
          $res2= Db::name('products')->where('id','=',1)->update(array('status'=>2));       
      }catch (\Exception $e){
          Db::rollback();
      } 
    
      if($re1 && $re2){
          Db::commit();
          return json_return("事务操作成功");      // json_return() 为封装返回json数据的方法
       }else{
          Db::rollback();
          return json_return($e->getMessage());      // json_return() 为封装返回json数据的方法
       }
    
     【延伸】 事务回滚的条件指的是 sql  语法报错,而不是增加、删除、更改 sql 时的影响行数为0
    
  • 问题2: 在事务中,使用了tp5 的函数 $this->success(),即使事务里面的 sql 语句都成功了,但还是走了rollback,为什么?

           Db::startTrans();
           try{
               Db::name('users')->insert(array('name'=>'mike','age'=>28));
               Db::name('products')->where('id','=',1)->update(array('status'=>2));       
               Db::commit();
               $this->success("事务操作成功");   
           }catch (\Exception $e){
               Db::rollback();
               $this->error($e->getMessage());
           }
    
           是因为$this->success() 这个函数的源码其实也是会抛出异常(这里可查看$this->success() 的方法),
           解决办法:
             将
                catch (\Exception $exception)
             改成
                catch (\think\Exception\DbException $exception)   // 仅catch sql 异常
             即可。
    

相关文章

  • 关于 tp5 事务操作总结

    前提: 使用事务处理的话,需要数据库引擎支持事务处理。比如 MySQL 的 MyISAM 不支持事务处理,需要使用...

  • Oracle事务Transaction

    参考资料: Transactions 关于Oracle事务的总结 什么是事务? 事务(Transaction)是访...

  • SQL基础(三)

    事务 主要总结Mysql中操作事物的过程。 预编译 主要总结Mysql中操作预编译的过程。说出预编译的优点,画出S...

  • TP5操作redis5.0.5使用delete()函数报错Fun

    TP5操作redis5.0.5使用delete()函数报错Function Redis::delete() is ...

  • 关于事务的总结

    一、什么是事务: 二、事务的特性(ACID) 原子性:事务是最小的执行单元,不允许分割。确保事务的执行要么全部完成...

  • spring事物的特性、传播机制、分类

    看到关于spring事物比较好的两篇文章,转载过来。 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作...

  • 事务、MySQL与Python交互、Python 中操作 MyS

    1、事务 事务操作分两种:自动事务(默认)、手动事务 手动事务的操作流程 开启事务:start transacti...

  • MySQL数据库的事务transaction

    事务操作分两种:自动事务(默认)、手动事务 手动事务的操作流程 开启事务:start transaction; 进...

  • Spring 事务 详解

    1. 关于事务 事务控制就是将一系列操作当成一个不可拆分的逻辑单元,保证这些操作要么都成功,要么都失败。在关系数据...

  • MySQL存储引擎MyISAM 和 InnoDB的区别

    简单总结:增删改操作多用InnoDB需要使用事务用InnoDB如果系统崩溃后需要自我修复使用InnoDB 读操作多...

网友评论

      本文标题:关于 tp5 事务操作总结

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