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();
    }
  • 相关阅读:
    栈的应用之银行叫号系统模拟
    栈的应用之括号匹配
    栈的应用之数制转换
    线性结构 一元多项式的乘法与加法运算
    Checkpoints codeforces 709B
    寒冰王座 hdu 1248(背包)
    单链表头插法、尾插法(26个字母为例)
    两个有序单链表的合并
    Number Sequence HDU 1711(KMP)
    完成运算
  • 原文地址:https://www.cnblogs.com/shangxia/p/5209518.html
Copyright © 2011-2022 走看看