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();
}
cakephp事务处理的更多相关文章
- In-Memory:内存优化表的事务处理
内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...
- 读书笔记--SQL必知必会20--管理事务处理
20.1 事务处理 使用事务处理(transaction processing),通过确保成批的SQL操作要么完全执行,要么完全不执行,来维护数据库的完整性. 如果没有错误发生,整组语句提交给数据库表 ...
- EntityFramework 事务处理
默认情况下,当EF调用SaveChanges()时,会把生成的所有SQL命令“包”到一个“事务(transaction)”中,只要有一个数据更新操作失败,整个事务将回滚. 在多数情况下,如果你总在数据 ...
- Java事务处理
Java事务处理总结 一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(co ...
- PHP与MYSQL事务处理
/*MYSQL的事务处理主要有两种方法.1.用begin,rollback,commit来实现begin 开始一个事务rollback 事务回滚commit 事务确认2.直接用set来改变mysql的 ...
- 已经过事务处理的 MSMQ 绑定(转载)
https://msdn.microsoft.com/zh-cn/biztalk/ms751493 本示例演示如何使用消息队列 (MSMQ) 执行已经过事务处理的排队通信. 注意 本主题的末尾介绍了此 ...
- SQLite剖析之事务处理技术
前言 事务处理是DBMS中最关键的技术,对SQLite也一样,它涉及到并发控制,以及故障恢复等等.在数据库中使用事务可以保证数据的统一和完整性,同时也可以提高效率.假设需要在一张表内一次插入20个人的 ...
- PHP系统声明式事务处理
转自:http://www.jianshu.com/p/34261804bc45 1.数据库事务 事务(Transaction)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行, ...
- [数据库]cakephp操作ENUM、tinyint等类型的一点说明
之前无法正常更新ENUM类型的数据,感觉是框架函数实现的bug. 问题很诡异,因为INIT的时候是可以成功写入的,没理由UPDATE的时候不成功. 前后琢磨了一下午,发现了一点蛛丝马迹才终于想通.问题 ...
随机推荐
- Oracle 10g 安装环境配置脚本
#!/bin/bash #Test in RHEL 5.5 for 10g c=`cat /etc/shadow | grep oracle | wc -l`if [ $c != 0 ]then w ...
- [NOIP 2015] 斗地主 landlord
想起几个月之前的 noip2015-只会瞎搞-这道题骗了 30 分.T T 题目 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 A 到 K 加上大小王的共 54 张牌 ...
- OpenCV-2.4.6-android-sdk 人脸识别demo搭建
最近项目需要研究下人脸识别,在领导推荐下准备研究OpenCV 一,上官网了解下 基本知识 http://docs.opencv.org/doc/tutorials/introduction/andro ...
- 表单文件上传,ajax文件上传
原创链接:http://www.cnblogs.com/yanqin/p/5345562.html html代码 index.jsp(表单文件上传) <form action="sh ...
- [ Python - 13 ] 批量管理主机必备模块
批量管理程序必备模块 optparse configparser paramiko optparse模块 简介: optparse模块主要用来为脚本传递命令参数功能 使用步骤: 1. i ...
- 运行HelloWorld.class是报错(错误: 找不到或无法加载主类 HelloWorld.class)
1.从毕业到现在工作了几个月了,每天都是在写一些js代码,感觉作为一个web程序员,java还是十分重要的,于是自己买了一本java书来边学边练习,然后发现自己连使用记事本来编写的HelloWorld ...
- mysql管理和基本操作
进去mysql:mysql –uroot –p 重启数据库:[root@nanaLinux ~]# /etc/init.d/mysqld restart 1.Mysql忘记root密码 // 查看my ...
- 通过Eclipse生成可运行的jar包
本来转自http://www.cnblogs.com/lanxuezaipiao/p/3291641.html 我是个追新潮的人,早早用上了MyEclipse10.最近需要使用Fat jar来帮我对一 ...
- Jstorm草草配置
今天帮同事调试一个双节点的Jstorm测试集群. UI界面总是不能出现集群的具体信息. 参考几个URL调了一下.搞定了. 收获以下知识点: 1,UI是在storm.yaml里配置的 2,Jstorm分 ...
- docker的存储结构,和以前有了很大不同
在网上学习这一块知识点时,有一个URL讲得很详细, docker 镜像与容器存储目录结构精讲 http://blog.csdn.net/wanglei_storage/article/details/ ...