laravel Model 执行事务的实现


Posted in PHP onOctober 10, 2019

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;
 
public function callRevert(Request $request){
  $data['call_id'] = intval($request->input('call_id'));
  $data['question_id'] = intval($request->input('question_id'));
  $data['call_name'] = $request->input('call_name');
  $data['revert'] = htmlspecialchars(trim($request->input('revert')));
  $list['page'] = intval($request->input('page'));
  $list['type_id'] = intval($request->input('type_id'));
  $list['status'] = intval($request->input('status'));
  $url = http_build_query($list);
  $url = action('Home\CallController@callQuestionView').'?'.$url;
  $validator = Validator::make($data, array('call_id' => 'required', 'call_name' => 'required','question_id'=>'required','revert'=>'required'));
  if($validator->fails()){
   FunctionController::error($url,'回复不能为空!');
  }else{
   DB::beginTransaction();
   try{
    FeedbackRevert::insert($data);
    FeedbackQuestion::where('id','=',$data['question_id'])->update(['status'=>1]);
    DB::commit();
    FunctionController::success($url,'回复成功!');
   }catch (\Exception $e) {
    DB::rollBack();
    FunctionController::error($url,'回复失败!');
   }
  }
 }

注意事务回滚之后会有自增id 不会连续 比如 3,4,5, 在5回滚之后 再次插入数据会变成 3,4,6 会跳过 为什么呢?

如果你认为自增ID不应该被事务化,那么其他事务不得不等待着,检查自增ID是被使用还是被回滚,这就导致阻塞

因为innodb的auto_increament的计数器记录的当前值是保存在存内 存中的,并不是存在于磁盘上,当mysql

server处于运行的时候,这个计数值只会随着insert改增长,不会随着delete而减少。而当mysql

server启动时,当我们需要去查询auto_increment计数值时,mysql便会自动执行:SELECT MAX(id) FROM 表名

FOR UPDATE;语句来获得当前auto_increment列的最大值,然后将这个值放到auto_increment计数器中。所以就算

Rollback MySQL的auto_increament计数器也不会作负运算

解决办法:可以使用count() 等计数 方式 插入id (比较麻烦)

以上这篇laravel Model 执行事务的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP 编程的 5个良好习惯
Feb 20 PHP
php 静态化实现代码
Mar 20 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
php学习之function的用法
Jul 14 PHP
递归删除一个节点以及该节点下的所有节点示例
Mar 19 PHP
ThinkPHP Mobile使用方法简明教程
Jun 18 PHP
PHP使用适合阅读的格式显示文件大小的方法
Mar 05 PHP
支付宝接口开发集成支付环境小结
Mar 17 PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 PHP
微信小程序结合ThinkPHP5授权登陆后获取手机号
Nov 23 PHP
laravel框架模型、视图与控制器简单操作示例
Oct 10 #PHP
laravel框架数据库配置及操作数据库示例
Oct 10 #PHP
Laravel 关联模型-关联新增和关联更新的方法
Oct 10 #PHP
Laravel 实现关系模型取出需要的字段
Oct 10 #PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
Oct 10 #PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 #PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
Oct 10 #PHP
You might like
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
使用phpstorm和xdebug实现远程调试的方法
2015/12/29 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
iview实现图片上传功能
2020/06/29 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
初学python数组的处理代码
2011/01/04 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
Python Logging 日志记录入门学习
2018/06/02 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
什么是方法的重载
2013/06/24 面试题
会计电算化应届生自荐信
2014/02/25 职场文书
2014年团支部工作总结
2014/11/17 职场文书
三峡人家导游词
2015/01/31 职场文书
教研活动主持词
2015/07/03 职场文书
2019各种保证书范文
2019/06/24 职场文书
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS