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多维数组的深度的方法
Jan 07 PHP
PHP中nowdoc和heredoc使用需要注意的一点
Mar 21 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
一款简单实用的php操作mysql数据库类
Dec 08 PHP
php实现word转html的方法
Jan 22 PHP
非常有用的9个PHP代码片段
Apr 06 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
Dec 27 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
laravel 实现向公共模板中传值 (view composer)
Oct 22 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 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
SMARTY学习手记
2007/01/04 PHP
php 动态添加记录
2009/03/10 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
PHP框架性能测试报告
2016/05/08 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
日期 时间js控件
2009/05/07 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
Raphael带文本标签可拖动的图形实现代码
2013/02/20 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
Python性能优化技巧
2015/03/09 Python
Python中有趣在__call__函数
2015/06/21 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
Python中collections模块的基本使用教程
2018/12/07 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
Django和Flask框架优缺点对比
2019/10/24 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
关工委先进个人事迹材料
2014/05/23 职场文书
小学校本培训方案
2014/06/06 职场文书
中秋晚会策划方案
2014/06/12 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript