我是一个半路出家的PHP程序员,到目前为止,不算在培训班学习的时间,已经写代码整整两年了。可能由于工作业务的原因,在这两年中我没有用到过MySQL事务。就在昨天有个关于支付宝转账的业务不得不使用MySQL事务来完成,别人说了很多,还是不明白MySQL事务到底是个啥,于是就开始了新一轮的补课,出来混,欠下的知识账总是要还的。

先简单说一下我昨天遇到的那个业务,我要在移动端发起一个支付宝提现的业务,这个业务我之前是分三步写的:

第一步:

首先提现的话,我先要在提现表里写入一条提现记录,再更新一下用户余额表,这两条数据的记录都是个预提现的记录,就是说他们的状态都是处理中;

第二步:

然后在请求支付宝的第三方接口;

第三步:

如果接口请求成功,用户已经收到支付宝付给用户的钱后,我们在更新提现记录表的状态和用户余额表的数据。

如果接口请求失败,用户没有收到支付宝转给用户的钱,则提现记录表的状态为提现失败。

但是如果用户发起了提现,用户预提现业务已经进行,但是第三方支付宝接口请求失败,此时突然断电,则数据库状态无法更改,然后结果就不是我们预想的结果了。此时MySQL事务在这种业务中就显现出了自己的价值。

MySQL事务:一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不执行,就是说我上面的提现业务,要么全部要执行成功,要么全部不成功,不会出现执行半截的情况。MySQL事务存在的意义就是保证数据的完整性。但是mysql中并不是所有的数据引擎都支持事务管理的,只有innodb支持事务管理。

事务管理的特性:

1. 原子性:事务的整个操作是一个整体,不可以分割,要么全部成功,要么全部失败。

2. 一致性:事务操作的前后,数据表中的数据没有变化。

3. 隔离性:事务操作是相互隔离不受影响的。

4. 持久性:数据一旦提交,不可改变,永久的改变数据表数据。

事务管理操作:

开启事务管理:开启之后,下面的sql语句并不会马上执行并把结果写到表中,而是会写到事务日志中。

start transaction;

回退操作:回退会清掉开始事务管理之后写到事务日志中的内容,即恢复到开启事务管理之前。

语法:rollback;

注意:回退操作只是回退"写"的内容,对于普通的读表select语句不能回退。

事务提交:将sql语句的结果写到数据表中。

语法:commit;

示例代码:

 /***
* Notes :商家商户端支付宝提现
* @Author : Dang Mengmeng
* @Date : 2019/7/9 0009 10:01
* @param $params
* @return mixed
* @throws BadRequestHttpException
*/
public function storeWith($params){
try{
$payee_account = $params['pay_account'];
$amount = $params['amount_of_acc'];
$request = new AlipayFundTransToaccountTransferRequest();
$connection = Yii::$app->db;
$transaction = $connection->beginTransaction(); //开始事务
//写入发起提现记录
$RES = StoreWith::updateWithData($x_id);
$financeId = StoreWith::insertLog($params);
$params['acc_id'] = $financeId;
$paymentId = StoreWith::insertPaymentLog($params);
$request->setBizContent("{" .
"\"out_biz_no\":$orderId," .
"\"payee_type\":\"ALIPAY_LOGONID\"," .
"\"payee_account\":$payee_account," .
"\"amount\":$amount," .
"\"remark\":\"收益提现\"" .
" }");
$result = $aop->execute($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode) && $resultCode == 10000){
//提现成功
$status = 1;
//1.更新入账资金数据状态
StoreWith::updateWithDataTwo($x_id,$status);
} else {
//提现失败
$status = 2;
StoreWith::updateWithDataTwo($x_id,$status);
}
if($resultCode == 10000){
$transaction->commit();//事务提交
}else{
$transaction->rollBack();//执行失败,事务回滚
}
return $resultCode;
}catch (\Exception $exception){
throw new BadRequestHttpException($exception->getMessage());
}
}

欠下的知识账总是要还的,晚知道不如早知道!!!

学习宜早不宜迟,一首趁早送给大家。哈哈哈!!!

MYSQL事务之Yii2.0商户提现的更多相关文章

  1. MySQL事务隔离级别,锁(转)

    add by zhj: 本文针对的是MySQL的InnoDB存储引擎,不适用于MySQL的其它存储引擎和其它数据库 原文:MySQL数据库事务隔离级别(Transaction Isolation Le ...

  2. MySQL 事务

    MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成 ...

  3. mysql事务和并发控制

    谈到事务,首先想到的问题是并发控制.比如两个用户同时操作数据库里面的一张表,一个正在读数据,一个正在删除数据,那么读数据的读出的结果究竟是多少?并发可以提高系统的性能,让多个用户同时操作一份数据,但为 ...

  4. MySQL事务学习-->隔离级别

    MySQL事务学习-->隔离级别 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别. 数据库是要被广大客户所共享访问的,那么在数据库操作过程中 ...

  5. PHP框架Yii2.0安装(基础版、高级版)

    最近农成也是切入了yiiframework 2.0,就是安装yii2.0就花费了不少的时间,为此做了很多的弯路,特此写一篇博文来给后面学习的同学少走一点的弯路.写的不好的地方欢迎各位学习的同学们能够指 ...

  6. Yii2.0 依赖注入(DI)和依赖注入容器的原理

    依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...

  7. php mysql事务

    这里记录一下php操作mysql事务的一些知识 要知道,MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务.但是,在使用事务时,是需要执行多条sq ...

  8. 测试MySQL事务管理

    1.MySQL 版本 mysql> select version(); +------------+ | version() | +------------+ -log | +--------- ...

  9. MySQL事务隔离级别初探

    MySQL有四种隔离级别,分别是: READ UNCOMMITTED(未提交读) READ COMMITTED(提交读) REPEATABLE READ (可重复读) SERIALIZABLE(可串行 ...

随机推荐

  1. 阿里云访问控制(RAM)授权子账户管理磁盘快照

    阿里云 RAM 控制台没有提供管理磁盘快照的系统策略,需要自己添加自定义授权策略. 操作步骤: 进入 RAM 控制台 -> 策略管理,点击"新建授权策略" 选中"空 ...

  2. Converter

    public class ImgPathConvert : IValueConverter { public object Convert(object value, Type targetType, ...

  3. VMNET 工作站

    nattunnel 快速连接内网电脑 内网穿透.内网映射,支持微信小程序本地开发 支持WEB.远程桌面.多种TCP协议 官方主页:http://www.vmnet.cc 用途 一个可以快速连接局域网中 ...

  4. Win10如何设置开机自动登录

    原文:Win10如何设置开机自动登录 第一步: 小娜搜索"netplwiz",进入用户账户设置. 第二步: 先勾选选中一次,要使用本计算机,用户必须输入用户名和密码. 第三步: 取 ...

  5. 图像滤镜艺术---保留细节的磨皮滤镜之PS实现

    原文:图像滤镜艺术---保留细节的磨皮滤镜之PS实现 目前,对于人物照片磨皮滤镜,相信大家没用过也听过吧,这个滤镜的实现方法是多种多样,有难有简,有好有差,本人经过长时间的总结,得出了一种最简单,效果 ...

  6. iOS中的加密操作

    最近项目中用到了一些加密操作,在这里简单总结了一下.总的来说加密分为对称加密和非对称加密两种,下面对这两种加密方式作一个简单的说明. 对称加密(Symmetric Cryptography) 对称加密 ...

  7. ArcGIS for Desktop入门教程_第三章_Desktop软件安装 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第三章_Desktop软件安装 - ArcGIS知乎-新一代ArcGIS问答社区 1 软件安装 1.1 安装前准备 请确认已经收到来自Esri中国( ...

  8. mysql索引创建&查看&删除

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  9. 安卓环境下,通过QT调用jar包

    在安卓上,许多第三方工具都提供jar包.qt可以通过jni来调用jar包.本文通过一个例子,说明安卓上QT调用jar的方式. 工具/原料   qt android jar包 jar包准备   1 ja ...

  10. 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...