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通用分页类page.php[仿google分页]
Aug 31 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
PHP中$_SERVER的详细参数与说明介绍
Oct 26 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
php+html5使用FormData对象提交表单及上传图片的方法
Feb 11 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
Aug 17 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 PHP
php函数式编程简单示例
Aug 08 PHP
Yii框架的redis命令使用方法简单示例
Oct 15 PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 PHP
windows系统php环境安装swoole具体步骤
Mar 04 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
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
Python3基础之基本运算符概述
2014/08/13 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
Python可以用来做什么
2020/11/23 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
新闻专业本科生的自我评价分享
2013/11/20 职场文书
专科生就业求职信
2014/06/22 职场文书
财务工作检讨书
2014/10/29 职场文书
大学感恩节活动总结
2015/05/05 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
如何书写邀请函?
2019/06/24 职场文书
导游词之南京夫子庙
2019/12/09 职场文书
SQLServer2008提示评估期已过解决方案
2021/04/12 SQL Server
DBCA命令行搭建Oracle ADG的流程
2021/06/11 Oracle
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js