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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
消息持续发送的完整例子
Oct 09 PHP
echo(),print(),print_r()之间的区别?
Nov 19 PHP
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
Jun 10 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
利用谷歌 Translate API制作自己的翻译脚本
Jun 04 PHP
destoon公司主页模板风格的添加方法
Jun 20 PHP
PHP简单实现“相关文章推荐”功能的方法
Jul 19 PHP
php简单统计字符串单词数量的方法
Jun 19 PHP
PHP身份证校验码计算方法
Aug 10 PHP
php实现登录页面的简单实例
Sep 29 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
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
php遍历数组的4种方法总结
2014/07/05 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
Add a Table to a Word Document
2007/06/15 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
jquery禁用右键示例
2014/04/28 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
Python创建数字列表的示例
2019/11/28 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
HTML5如何为形状图上颜色怎么绘制具有颜色和透明度的矩形
2014/06/23 HTML / CSS
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
党性分析材料格式
2014/12/19 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
小学秋季运动会通讯稿
2015/11/25 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电