事务的机制通常被概括为“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. PHP+Redis 实例【二】页面缓存 新玩法

    今天算是认识到博客园里的审查团队多内幕了,哈哈,贴个图玩下. 气死宝宝了. 进入主题! 今天就不写什么功能性的了,换下口味说下关于页面级的缓存,应该怎么做. 相信有很多小伙伴查了百度,甚至google ...

  2. WCF、WebAPI、WCFREST、WebService之间的区别和选择

    转载翻译,原文:http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-a ...

  3. [安全]PHP能引起安全的函数

    php中需要禁用以下函数来提高安全性 打开php.ini  找到 disable_functions .然后禁用以下函数 [C] 纯文本查看 复制代码 ? 1 disable_functions = ...

  4. PL/SQL简单实现数据库的连接

    通常我们都会去选择 通过修改配置文件去实现数据库链接,方法如下:找到你orale 安装下的文件:instantclient_11_2\network\admin 修改的主要有三个地方:上面的命名随便起 ...

  5. [转]git问题ERROR: Repository not found.的解决

    原文地址:http://blog.csdn.net/u010154424/article/details/51233966 在github中新增了一个项目,按照git的提示添加了远程仓库,但是提交的时 ...

  6. Postgres是如何管理空值的

    创建表test,y字段插入null. test=# create table test(x bigint,y bigint,z text); CREATE TABLE test=# insert in ...

  7. 3、C#基础 - C# 的 Hello World

    HelloWorld,是学会程序的通用起手式了,哈哈. 打开我们的VS:文件\新建\项目 选择"控制台应用(.NET Framework)",名称改为"HelloWorl ...

  8. bootstrap validator 使用 带代码

    如何使用bootstrapVlidator插件? 下载bootstrapVlidator插件 在需要使用的页面引入bootstrapVlidator的js文件和css文件 如: 注: 在此基础之前必须 ...

  9. C++ stack

    stack 栈,一种后进先出的数据结构,在c++ stl里作为容器适配器,string,vector,deque,在内存中是连续的 声明方式 stack<int,deque<T>&g ...

  10. day2、Linux别名

    Linux中修改配置别名 ####用到的命令: alias是用来查看系统中有什么别名 source 让配置生效 临时取消别名的方法 unalias 临时取消别名 \cp /mnt/test.txt / ...