事务的机制通常被概括为“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. 【javaFX学习】(一) 建一个简单的界面

    转载注明出处:http://www.cnblogs.com/lensener/p/7976953.html 用过swing都知道有多蛋疼,界面有多丑.自从用了javaFX,腰也不酸了,腿也不疼了. 废 ...

  2. selenium与表格的二三事

    今天遇到的问题是selenium与表格中行和列的问题! 我想要做的事情是统计当前的table有多少行,表格形式如下如所示: 图中所示为2行,我的定位方式是这样的 : table=driver.find ...

  3. Servlet,JSP 中的中文乱码问题以及解决方案

    问题描述: 在Servlet,JSP 传递数据中,英文无影响,而中文有时候就会出现乱码. 解决方案: 相同的编码: 同一个项目中的每个文件应当设置和保存相同的编码方式,如: html中 <met ...

  4. python随机图片验证码的生成

    Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 from PIL import Im ...

  5. CCF-201312-3-最大的矩形

    问题描述 试题编号: 201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ ...

  6. CCF-201412-3-集合竞价

    问题描述 试题编号: 201412-3 试题名称: 集合竞价 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定 ...

  7. 域名和ip不能访问的原因

    centos的话可能默认可能会有firewalld,可以执行 systemctl stop firewalld systemctl disable firewalld 禁用后在看看,前提都是域名得备案 ...

  8. SketchMaster 隐私政策

    隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐 ...

  9. 关于pipelineDB调用GetLocalStreamReaders的BUG

    如果想获取一个stream所有的reader,那么必须调用这个函数: Bitmapset *targets = GetLocalStreamReaders(relid); 如果stream下面没有re ...

  10. constructor 属性,判断是否为数组

    <!--你可以使用 constructor 属性来查看是对象是否为数组 (包含字符串 "Array"):--><p>constructor属性返回变量或对象 ...