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 一个页面执行时间类代码
Mar 05 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
Jun 07 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 PHP
php 目录遍历、删除 函数的使用介绍
Apr 28 PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 PHP
php中file_exists函数使用详解
May 08 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
May 19 PHP
PHP常用的三种设计模式
Feb 17 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
PHP处理bmp格式图片的方法分析
Jul 04 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
PHP文件后缀不强制为.php方法
Mar 31 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
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
微信支付开发教程(一)微信支付URL配置
2014/05/28 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
jQuery实现类似淘宝购物车全选状态示例
2013/06/26 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
ES6新增数据结构WeakSet的用法详解
2017/08/07 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
Python中的exec、eval使用实例
2014/09/23 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
详解Python with/as使用说明
2018/12/13 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
市级优秀班主任事迹材料
2014/05/13 职场文书
电子信息工程自荐信
2014/05/26 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
python实现网络五子棋
2021/04/11 Python
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers