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数组应该有多大的分析
Jul 30 PHP
PHP的一个基础知识 表单提交
Jul 04 PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 PHP
PHP系列学习之日期函数使用介绍
Aug 18 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
PHP curl使用实例
Jul 02 PHP
php结合curl实现多线程抓取
Jul 09 PHP
php使用APC实现实时上传进度条功能
Oct 26 PHP
Yii基于数组和对象的Model查询技巧实例详解
Dec 28 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
PHP基于openssl实现非对称加密代码实例
Jun 19 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 判断常量,变量和函数是否存在
2009/04/26 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
php查找指定目录下指定大小文件的方法
2014/11/28 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
jquery实现拖动效果(代码分享)
2017/01/25 Javascript
使用D3.js制作图表详解
2017/08/13 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
解读Django框架中的低层次缓存API
2015/07/24 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
购买大码女装:Lane Bryant
2016/09/07 全球购物
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
统计员岗位职责
2013/11/14 职场文书
怎样写演讲稿
2014/01/04 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
建筑学专业自荐书
2014/07/09 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
员工升职自荐信
2015/03/27 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
SQL SERVER触发器详解
2022/02/24 SQL Server