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 相关文章推荐
基于asp+ajax和数据库驱动的二级联动菜单
May 06 PHP
PHP获取文件绝对路径的代码(上一级目录)
May 29 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
Jan 10 PHP
浅谈PHP变量作用域以及地址引用问题
Dec 27 PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 PHP
php中的静态变量的基本用法
Mar 20 PHP
PHP连接SQLServer2005的方法
Jan 27 PHP
php实现的简单检验登陆类
Jun 18 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 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危险函数(disable_functions)
2012/02/23 PHP
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
php数组键值用法实例分析
2015/02/27 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
设定php简写功能的方法
2019/11/28 PHP
JavaScript 字符编码规则
2009/05/04 Javascript
CSS和Javascript简单复习资料
2010/06/29 Javascript
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
Javascript日期格式化format函数的使用方法
2016/08/30 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
微信小程序使用自定义组件导航实现当前页面高亮
2020/01/02 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
python输出pdf文档的实例
2020/02/13 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
Servlet如何得到客户端机器的信息
2014/10/17 面试题
给民警的表扬信
2014/01/08 职场文书
创业融资计划书
2014/04/25 职场文书
优秀班组长事迹
2014/05/31 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
婚礼长辈答谢词
2015/09/29 职场文书