tp3.2 事务处理
事务的机制通常被概括为“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 事务处理的更多相关文章
- Spring事务处理
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 数据库向用户提供保存当前程序状态的方法,叫事务提交(commit): ...
- 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)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行, ...
随机推荐
- Django的ModelForm组件
创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import mode ...
- 第十一章 泛型算法 C++ PRIMER
vector<int>::const_iterator result = find(vector.begin(). vector.end(),search_value); 如果查找失败,分 ...
- String、StringBuilder和StringBuffer
1.string不可变性 java的docs有这样一句话:Strings are constant; their values cannot be changed after they are cre ...
- ThinkPHP 5 中AJAX跨域请求头设置方法
最近用thinkphp做项目,在测试环境时,存在接口的测试问题.在tp官网也没能找到相关的解决方法.自已看了一下源码,有如下的解决方案. 在项目目录下面,创建common/behavior/CronR ...
- Music Tags 隐私政策
隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐 ...
- Codeforces Gym 101521A Shuttle Bus
题意:给定一个2*N的方格,从左上角开始走,有些格子不能走,问能否一次遍历所有能走的方格 在Gym上看到一场香港的比赛,很好奇就去看了一下,发现第一题很有趣,并且很水,似乎讨论一下奇偶性就行了,然后. ...
- TP3.2 图片上传及缩略图
基于TP自带的上传文件的类, Think/Upload.class.php 设置表单的enctype属性 下面是上传的具体方法 /** * 图片上传处理 * @param [String] $path ...
- [Python学习] 简单网络爬虫抓取博客文章及思想介绍
前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...
- Java并发编程实践读书笔记(2)多线程基础组件
同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到, ...
- 2017年国内常用的公共NTP服务
安卓机顶盒里常用的 http://cn.pool.ntp.org CERNET 的一堆服务器就在那里面 http://asia.pool.ntp.org 追踪它的IP,台湾.韩国.日本都有. 阿里云 ...