laravel5如何使用事务
时间:2019-01-13
本文章向大家介绍laravel5如何使用事务,主要包括laravel5如何使用事务使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.官方手册是这样介绍的:
想要在一个数据库事务中运行一连串操作,可以使用DB
门面的transaction
方法,如果事务闭包中抛出异常,事务将会自动回滚。如果闭包执行成功,事务将会自动提交。使用transaction
方法时不需要担心手动回滚或提交:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
手动使用事务
如果你想要手动开始事务从而对回滚和提交有一个完整的控制,可以使用DB
门面的beginTransaction
方法:
DB::beginTransaction();
你可以通过rollBack
方法回滚事务:
DB::rollBack();
最后,你可以通过commit
方法提交事务:
DB::commit();
注意:使用DB
门面的事务方法还可以用于控制查询构建器和 Eloquent ORM 的事务。
2.具体是这样使用的:
use Illuminate\Support\Facades\DB;
//开启事务
DB::beginTransaction();
try{
//中间逻辑代码 DB::commit();
}catch (\Exception $e) {
//接收异常处理并回滚 DB::rollBack();
}
处理方法:
方法一、
try {
DB::beginTransaction();
$order = new PaymentOrderModel();
$order->sn = createOrderSn(OrderTypeConst::PAY, $data['user_id']);
$order->channel = $data['channel'];
$order->channel_sn = $data['sn'];
$order->city_id = $data['city_id'];
$order->dispatch_way = $data['dispatch_way'];
$order->ext = isset($data['ext']) ? $data['ext'] : '';
$order->start_pay_time = (new Carbon("now"))->toDateTimeString();
$order->expired_at = $data['expired_at'];
$flag = $order->save();
if (!$flag) throw new LogicException(1031007, ['data' => $data]);
//保存订单商品数据
$flag = $this->createOrderGoods($order);
if (!$flag) throw new LogicException(1031008, ['data' => $data['product']]);
$this->addStatusLog(
[
'order_sn' => $order->sn,
'origin_status' => 0,
'current_status' => PaymentOrderStatusConst::UNPAY,
'user_id' => $order->user_id,
'user_type' => OpUserTypeConst::FRONTEND_USER_TYPE,
'action' => PaymentOrderStatusLogConst::ACTION_TYPE_OF_CREATE,
]
);
DB::commit();
return $order->sn;
} catch (LogicException $e) {
DB::rollBack();
}
方法二、
if( CodeCodeStatusConst::STATUS_SOLD == $codeCodeModel->status && $now->gt($startDate) && $now->lt($endDate) ) {
if($isExchange == true) { //验证电子码时,需要更新状态
//开启事务
CodeCodeModel::query()->getQuery()->getConnection()->beginTransaction();
PaymentSettlementModel::query()->getQuery()->getConnection()->beginTransaction();
$codeCodeModel->status = CodeCodeStatusConst::STATUS_EXCHANGE; // 修改状态
$codeCodeModel->save();
// 记录log
$codeCodeValidationModel = new CodeCodeValidationLogModel();
$codeCodeValidationModel->user_id = 0;
$codeCodeValidationModel->validate_time = Carbon::now()->toDateTimeString();
$codeCodeValidationModel->code_code_id = $codeCodeModel->id;
$codeCodeValidationModel->salesroom_id = $salesroomModel->id;
$codeCodeValidationModel->save();
// 生成付款结算单
$order = $codeCodeModel->codeGoodsOrder;
$data['settlement_merchant_id'] = $salesroomModel->settlement_merchant_id;
$data['order_sn'] = $order->sn;
$data['vendor_sn'] = '';
$data['express'] = 0;
$data['num'] = 1;
$data['detail'] = $order->code_goods_name . ' x 1, ' . //商品名名称x数量,
'券号: ' . $codeCodeModel->code . ', ' . //券号123456
'结算总额: ' . FormatMoney::fen2yuan($data['total']) . '元' . //结算总额20元
'消费场馆: ' . $salesroomModel->name;//消费场馆:xxx场馆
(new SettlementBls())->createPaymentSettlement($data);
CodeCodeModel::query()->getQuery()->getConnection()->commit();
PaymentSettlementModel::query()->getQuery()->getConnection()->commit();
}
// 验证成功
return CodeValidatorConst::SUCCESS;
}
- android获得ImageView图片的等级
- SqlServer:此数据库处于单用户模式,导致数据库无法删除的处理
- jQuery中排除指定元素,同时选择剩下的所有元素
- windows客户机连接gerrit的一个报错处理
- 装箱与值类型虽然很容易理解,但是在实际使用中,并不总是能100%用对
- Jexus 配置ssl
- 局部打印插件 jquery.PrintArea.js
- FluorineFx应用中“页面长时间不动”导致无法连接的解决办法
- Mysql主从同步(1)-主从/主主环境部署梳理
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
- 网站压力测试软件WebBench以及压测Jexus
- Gershon Dublon & Nan Zhao:用传感器网络感知世界
- 即日起珠海可用微信乘公交,腾讯乘车码助力智慧城市建设
- 利用mk-table-checksum监测Mysql主从数据一致性操作记录
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- MySQL LOAD DATA INFILE—从文件(csv、txt)批量导入数据
- MySQL 快速删除大量数据(千万级别)的几种实践方案——附源码
- 什么样的代码是好代码?
- Elastic search集群新增节点(同一集群,同一物理机)
- Tesseract-OCR 4.1.0 安装和使用— windows及CentOS
- Java 大小端转换(基于ByteBuffer)
- Tika结合Tesseract-OCR 实现光学汉字识别(简体、宋体的识别率百分之百)—附Java源码、测试数据和训练集下载地址
- 阿里《JAVA实习生入职测试题—2019最新》之答案详解(连载一)
- 阿里《JAVA实习生入职测试题—2019最新》之答案详解(连载二)
- 动态生成RDLC报表
- Angular 页面元素的DOM级别的删除过程
- 单例模式—四种写法详解
- Angular view container删除view实例的过程
- Angular自定义structural指令的实例化过程以及set方法的调用
- Angular structural指令host element的定位调试