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新手上路(四)
Oct 09 PHP
php实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
php简单实现查询数据库返回json数据
Apr 16 PHP
织梦sitemap地图实时推送给百度的教程
Aug 03 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
May 04 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
PHP中一个有趣的preg_replace函数详解
Aug 15 PHP
php 读取文件夹下所有图片、文件的实例
Oct 17 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
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
2016/10/29 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
使用原生js写的一个简单slider
2014/04/29 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
了解在JavaScript中将值转换为字符串的5种方法
2019/06/06 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
python连接mysql并提交mysql事务示例
2014/03/05 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
幼儿园教师请假制度
2014/01/16 职场文书
入股协议书
2014/04/14 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
毕业生面试求职信
2014/06/23 职场文书
社区创先争优承诺书
2014/08/30 职场文书
客户答谢会活动方案
2014/08/31 职场文书
2015国庆节宣传语
2015/07/14 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书