zoukankan      html  css  js  c++  java
  • cakephp事务处理

    使用cakephp框架做开发时,涉及到多个数据表的数据保存,需要使用cakephp的事务处理,查cakephp的说明手册也没看明白,从开发社区中看到了解决的办法,考虑到英文的问题,所以转给大家,以供参考:

    一、首先上cakephp的开发手册上的说明

    要执行事务,模型所对应的表必须属于支持事务的数据源和类型。

    所有的事务方法必须用模型的数据源对象来执行。要在模型中获得模型的数据源,请用:

    $dataSource = $this->getDataSource();

    接着你就可以使用数据源来开始、提交或者回滚事务。

    $dataSource->begin();
    
    // 执行一些任务
    
    if (/*一切正常*/) {
        $dataSource->commit();
    } else {
        $dataSource->rollback();
    }

    嵌套事务

    可以使用 Datasource::begin() 方法多次开始事务。只有当 commit 与 rollback 方法的调用次数与 begin 方法的调用次数相等时,事务才会结束:

    $dataSource->begin();
    // 执行一些任务
    $dataSource->begin();
    // 再执行几个任务
    if (/*最后的任务成功*/) {
        $dataSource->commit();
    } else {
        $dataSource->rollback();
        // 在主任务中改变一些东西
    }
    $dataSource->commit();

    如果数据库支持嵌套事务、并且在数据源中开启嵌套事务支持,才会真的执行嵌套事务。如 果不支持嵌套事务或者嵌套事务支持被关闭,在事务模式中,这些方法总是会返回 true。

    如果你想多次开始事务、但不使用数据库的嵌套事务,可以使用 $dataSource->useNestedTransactions false; 来关闭嵌套事务支持。这会仅使用一 个全局事务。

    实际的嵌套事务默认为关闭。使用 $dataSource->useNestedTransactions true; 来 开启它。

    二、在开发社区中看到的解决办法

    Controller中:

    获取model的数据源

    $ds = $this->MyModelName->getdatasource();

    这时就可以在Controller里接着使用cakephp的事务处理了

    $ds->begin();
    
    // do stuff and save data to models
    
    if($success)
    {
        $ds->commit();
    }
    else
    {
        $ds->rollback();
    }
  • 相关阅读:
    [Web安全] XXE漏洞攻防学习(中)
    [Web安全] XXE漏洞攻防学习(上)
    [转]kali中eth0网卡突然消失解决方案
    [漏洞复现]CVE-2018-4887 Flash 0day
    [漏洞复现]CVE-2010-2883 Adobe Reader 打开pdf电脑即刻中招
    [漏洞复现] CVE-2017-11882 通杀所有Office版本
    墨菲定律:Mac本硬盘坏了
    独立思考
    阅读书单
    2020未来小思考
  • 原文地址:https://www.cnblogs.com/shangxia/p/5209518.html
Copyright © 2011-2022 走看看