事务的机制通常被概括为“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. Imageloader框架

    package adapter;import android.content.Context;import android.graphics.Bitmap;import android.graphic ...

  2. 35.Linux-分析并制作环形缓冲区

    在上章34.Linux-printk分析.使用printk调试驱动里讲述了: printk()会将打印信息存在内核的环形缓冲区log_buf[]里, 可以通过dmesg命令来查看log_buf[] 1 ...

  3. ELK介绍

    为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,需要集中化的日志管理,所有服务器上的日志收集汇总. ...

  4. react-native从开始趟的坑

    好多天没更了..... 之前用的华为手机老人机真机调试的,最近几天换了小米,又遇上了坑... 跟之前所有手机一样打开开发者模式,开发者模式是(关于手机--版本号---一直点啊点--退出---辅助功能里 ...

  5. winform在鼠标操作时要判断是否按下Ctrl键

    (Control.ModifierKeys & Keys.Control) == Keys.Control

  6. SpringCloud Feign对Hystrix(断路由)的支持

    第一步:首先开启Feign对Hystrix的支持,在properties文件中添加以下配置: feign.hystrix.enabled=true. 第二步:在上一篇Feign的基础上添加Hystri ...

  7. java上传图片剪切工具类

    package com.up.util; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io. ...

  8. x86内存映射

    Contents 1 "Low" memory (< 1 MiB) 1.1 Overview 1.2 BIOS Data Area (BDA) 1.3 Extended BI ...

  9. Linux批量杀死包括某个keyword的进程

    ps -ef|grep ./amplxe-gui|grep -v grep|cut -c 9-15|xargs kill -9 批量杀死包括keyword"./amplxe-gui" ...

  10. kafka入门样例 for java

    1,生产者 import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.Key ...