视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MYSQL事务教程之Yii2.0商户提现功能
2020-11-09 21:12:41 责编:小采
文档

前言

我是一个半路出家的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());
 }
}

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

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

总结

下载本文
显示全文
专题