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代码的53条建议
Mar 27 PHP
mysql 性能的检查和优化方法
Jun 21 PHP
php如何调用webservice应用介绍
Nov 24 PHP
PHP过滤★等特殊符号的正则
Jan 27 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
PHP框架Swoole定时器Timer特性分析
Aug 19 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
Dec 17 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
Feb 10 PHP
PHP从FLV文件获取视频预览图的方法
Mar 12 PHP
php有效防止图片盗用、盗链的两种方法
Nov 01 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
Sep 26 PHP
如何在centos8自定义目录安装php7.3
Nov 28 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
php unset全局变量运用问题的深入解析
2013/06/17 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
document.addEventListener使用介绍
2014/03/07 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
大学生职业生涯规划书模板
2014/01/03 职场文书
元旦红领巾广播稿
2014/02/19 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
2015年汽车销售工作总结
2015/04/07 职场文书
食堂管理制度范本
2015/08/04 职场文书
晚会开幕词范文
2016/03/04 职场文书
Python Pandas解析读写 CSV 文件
2022/04/11 Python