事务的机制通常被概括为“ACID”原则即原子性(A)、稳定性(C)、隔离性(I)和持久性(D)。 
  原子性:构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。 
  稳定性:数据库在事务执行前后状态都必须是稳定的。 
  隔离性:事务之间不会相互影响。 
  持久性:事务执行成功后必须全部写入磁盘

场景:需要对多个表同时进行修改操作,用到了事物

先看代码(controller)

/**
* 返利记录
*/
public function payBack(){ if($_GET['ins']){
$id = I('id'); //ID
$uuid = I('uuid'); //UUID
switch ($_GET['ins'])
{
case 'tongguo':
if(!empty($id)&&!empty($uuid)){
$result = D('Red')->redPack($id,$uuid,1);   //重点在这里 往⬇️看
if($result){
$this->success('已通过',__ROOT__);
}else{
$this->error('通过失败',__ROOT__);
}
}
exit;
break;
case 'quxiao':
if(!empty($id)&&!empty($uuid)){
$result = D('Red')->redPack($id,$uuid,-1);
if($result){
$this->success('取消通过',__ROOT__);
}else{
$this->error('取消通过失败',__ROOT__);
}
}
exit;
break;
}
}
}

(Model)

/**
* 【红包返利】
* @param string $id
* @param string $uuid
* @param string $ispass 1:通过 -1:不通过
* @return bool
*/
public function redPack($id='',$uuid='',$ispass=''){
if(!empty($id)&&!empty($uuid)){
$data['isCheck'] = $ispass;
M()->startTrans();  
$result = $this->where('id='.$id)->save($data);
$resultBalance = $resultCheck = true; //余额 返利状态
if(!empty($result)){
//通过 修改余额
if($ispass==1){
$list = M('redpack as ra ')
->join(' LEFT JOIN t_account as ga on ra.uuid=ga.uuid')
->where(" ra.id=$id and ra.uuid=$uuid ")
->field('ra.redpackmoney,ra.uuid,ga.accountBalance')
->find();
if($list['redpackmoney']==0){
return true;
}else{
$balanceData['accountBalance'] = $list['accountbalance']+$list['redpackmoney']; //修改用户余额
}
$resultBalance = M('Account')->where("uuid=".$list['uuid'])->save($balanceData); //用户表 Account $checkData['isReceive'] = $ispass; //修改是否领取
$checkData['receiveTime'] = strtotime(date("Y-m-d h:i:s")); //修改领取时间
$resultCheck = $this->where("id=$id and uuid=$uuid" )->save($checkData); //返利表 redPack
}else if($ispass==-1){
$resultCheck = true;
}
} if(!empty($result) && !empty($resultBalance) && !empty($resultCheck) ){
M()->commit();
return true;
}else{
M()->rollback();
return false;
}
}
}

形式:  

M()->startTrans();
执行操作1 增删改查
判断1
  成功:执行2,3......  增删改查
判断1,2,3
  同时成功(true)
    M()->commit();
  否则
    M()->rollback();
返回最终结果
可以自己打印 结果1,2,3 看看什么原因 多动手,更优秀。

tp3.2 事务处理的更多相关文章

  1. Spring事务处理

    事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 数据库向用户提供保存当前程序状态的方法,叫事务提交(commit): ...

  2. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

  3. 读书笔记--SQL必知必会20--管理事务处理

    20.1 事务处理 使用事务处理(transaction processing),通过确保成批的SQL操作要么完全执行,要么完全不执行,来维护数据库的完整性. 如果没有错误发生,整组语句提交给数据库表 ...

  4. EntityFramework 事务处理

    默认情况下,当EF调用SaveChanges()时,会把生成的所有SQL命令“包”到一个“事务(transaction)”中,只要有一个数据更新操作失败,整个事务将回滚. 在多数情况下,如果你总在数据 ...

  5. Java事务处理

    Java事务处理总结     一.什么是Java事务   通常的观念认为,事务仅与数据库相关.   事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(co ...

  6. PHP与MYSQL事务处理

    /*MYSQL的事务处理主要有两种方法.1.用begin,rollback,commit来实现begin 开始一个事务rollback 事务回滚commit 事务确认2.直接用set来改变mysql的 ...

  7. 已经过事务处理的 MSMQ 绑定(转载)

    https://msdn.microsoft.com/zh-cn/biztalk/ms751493 本示例演示如何使用消息队列 (MSMQ) 执行已经过事务处理的排队通信. 注意 本主题的末尾介绍了此 ...

  8. SQLite剖析之事务处理技术

    前言 事务处理是DBMS中最关键的技术,对SQLite也一样,它涉及到并发控制,以及故障恢复等等.在数据库中使用事务可以保证数据的统一和完整性,同时也可以提高效率.假设需要在一张表内一次插入20个人的 ...

  9. PHP系统声明式事务处理

    转自:http://www.jianshu.com/p/34261804bc45 1.数据库事务 事务(Transaction)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行, ...

随机推荐

  1. 02-线性结构4 Pop Sequence

    题目 Sample Input: 5 7 5 1 2 3 4 5 6 7 3 2 1 7 5 6 4 7 6 5 4 3 2 1 5 6 4 3 7 2 1 1 7 6 5 4 3 2 Sample ...

  2. GC 基础(转)

    转自:http://blog.csdn.net/ning109314/article/details/10411495/ = GC 基础 ===================== JAVA堆的描述如 ...

  3. Azure 基础:使用 Traffic Manager 分流用户请求

    为了减少 web 服务器的宕机时间,同时也提高服务器的响应性能,我们往往部署多个站点并通过负载均衡来对外提供服务.Azure 提供的 Traffic Manager 服务属于负载均衡的一种,特点是工作 ...

  4. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十六节--SignalR与ABP框架Abp.Web.SignalR及扩展

    SignalR简介 SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...

  5. [Bootstrap 源码]——bootstrap源码之初始化

    bootstrap源码之初始化 我们先来分析normalize.less编译后的源码,我们知道normalize.css是一个专门将不同浏览器的默认css特性设置为统一效果的css库,它和reset. ...

  6. Dubbo源码学习--服务发布(DubboProtocol、Exporter)

    在Dubbo服务发布的整体流程一文中,只是分析了服务发布的整体流程,具体的细节还没有进一步分析.本节将继续分析服务暴露的过程.在ServiceConfig中通过一句话即可暴露服务,如下: Export ...

  7. .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)

    一.前言 本篇开发环境?1.操作系统: Windows 10 X642.SDK: .NET Core 2.0 Preview 二.安装 .NET Core SDK 1.下载 .NET Core下载地址 ...

  8. UPDATE/INSERT用法研究

    UPDATE和INSERT语法相信大家都很熟悉,UPDATE的基本语法结构是 : UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 INSERT的基本语法是: INSERT ...

  9. cronlog分割tomcat catalina.out日志

    Tomcat 下日志文件 catalina.out 过大,几百兆或几个G,进而造成再也无法写入更多的日志内容,至使 Tomcat 无法处理请求,所以依靠cronlog来分割: 具体步骤如下: 1.安装 ...

  10. Loadrunner 中socket协议RecvBuffer接收到数据长度为空

    socket通讯,有两种方式,一种是建立长连接(TCP),建立后,不停的发送,接收.另外一种是建立短连接(UDP),建立连接,发送报文,接收响应,关闭连接.两种方式 server的开销不同. 今天出现 ...