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,不用COM,生成excel文件
Oct 09 PHP
php生成随机密码的几种方法
Jan 17 PHP
非常好用的Zend Framework分页类
Jun 25 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
Jun 26 PHP
php实现的CSS更新类实例
Sep 22 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
Zend Guard使用指南及问题处理
Jan 07 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
Feb 10 PHP
php递归遍历删除文件的方法
Apr 17 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
thinkphp下MySQL数据库读写分离代码剖析
Apr 18 PHP
php array_map()函数实例用法
Mar 03 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 strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
如何使用php输出时间格式
2013/08/31 PHP
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
十个Python程序员易犯的错误
2015/12/15 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
python 进程的几种创建方式详解
2019/08/29 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
python sorted函数原理解析及练习
2020/02/10 Python
机械工程师求职自我评价
2013/09/23 职场文书
幼师自我鉴定
2014/02/01 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
法制工作总结2015
2015/07/23 职场文书
员工规章制度范本
2015/08/07 职场文书
消防演习感想
2015/08/10 职场文书
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis