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 相关文章推荐
MYSQL环境变量设置方法
Jan 15 PHP
php下检测字符串是否是utf8编码的代码
Jun 28 PHP
php中取得URL的根域名的代码
Mar 23 PHP
php截取字符串并保留完整xml标签的函数代码
Feb 06 PHP
解析php下载远程图片函数 可伪造来路
Jun 25 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
Nov 07 PHP
php实现json编码的方法
Jul 30 PHP
64位windows系统下安装Memcache缓存
Dec 06 PHP
php版微信发红包接口用法示例
Sep 23 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 PHP
laravel 实现上传图片到本地和前台访问示例
Oct 21 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相关资料
2006/10/09 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
phpstudy2020搭建站点的实现示例
2020/10/30 PHP
原型方法的不同写法居然会影响调试的解决方法
2007/03/08 Javascript
jQuery 常见学习网站与参考书
2009/11/09 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
几种响应式文字详解
2017/05/19 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
python模块导入的细节详解
2018/12/10 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
银行出纳岗位职责
2013/11/25 职场文书
八项规定整改方案
2014/02/21 职场文书
股权转让协议书范本
2014/04/12 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
文员岗位职责
2015/02/04 职场文书