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 相关文章推荐
javascript,php获取函数参数对象的代码
Feb 03 PHP
php实现memcache缓存示例讲解
Dec 04 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
php 防止表单重复提交两种实现方法
Nov 03 PHP
PHP进程通信基础之信号量与共享内存通信
Feb 19 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
May 19 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
Sep 30 PHP
PHP Pipeline 实现中间件的示例代码
Apr 26 PHP
PHP实现简易用户登录系统
Jul 10 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
Mar 09 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
PHP5中虚函数的实现方法分享
2011/04/20 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
javascript实现按回车键切换焦点
2015/02/09 Javascript
javascript实现当前页导航激活的方法
2015/02/27 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
JavaScript 身份证号有效验证详解及实例代码
2016/10/20 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
pytorch简介
2020/11/11 Python
Django数据统计功能count()的使用
2020/11/30 Python
英国轻奢珠宝品牌:Astley Clarke
2016/12/18 全球购物
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
毕业自我鉴定范文
2013/11/06 职场文书
力学专业求职信
2014/07/23 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
员工培训协议书
2014/09/15 职场文书
检讨书怎么写
2015/01/23 职场文书
农业项目投资意向书
2015/05/09 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书