laravel Model 执行事务的实现

 更新时间:2019年10月10日 14:13:52   作者:woshihaiyong168  
今天小编就为大家分享一篇laravel Model 执行事务的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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 执行事务的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Yii框架常见缓存应用实例小结

    Yii框架常见缓存应用实例小结

    这篇文章主要介绍了Yii框架常见缓存应用,结合实例形式分析了Yii框架缓存相关的配置、获取、查询等操作技巧与注意事项,需要的朋友可以参考下
    2019-09-09
  • thinkPHP实现的联动菜单功能详解

    thinkPHP实现的联动菜单功能详解

    这篇文章主要介绍了thinkPHP实现的联动菜单功能,结合实例形式分析了thinkPHP联动菜单的实现步骤与具体操作技巧,需要的朋友可以参考下
    2017-05-05
  • Laravel框架视图和模型操作方法分析

    Laravel框架视图和模型操作方法分析

    这篇文章主要介绍了Laravel框架视图和模型操作方法,结合实例形式详细分析了laravel框架视图和模型的概念、原理、创建及使用方法,需要的朋友可以参考下
    2019-12-12
  • 使用xampp搭建运行php虚拟主机的详细步骤

    使用xampp搭建运行php虚拟主机的详细步骤

    这篇文章主要介绍了通过使用xampp搭建运行php虚拟主机的步骤,介绍很详细,感兴趣的小伙伴们可以参考一下
    2015-10-10
  • CI框架(CodeIgniter)实现的导入、导出数据操作示例

    CI框架(CodeIgniter)实现的导入、导出数据操作示例

    这篇文章主要介绍了CI框架(CodeIgniter)实现的导入、导出数据操作,结合实例形式分析了CodeIgniter框架libraies中引用PHPExcel实现数据导入导出相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • PHP实现小偷程序实例

    PHP实现小偷程序实例

    本篇文章主要介绍了PHP实现小偷程序实例,实现了抓取网页咨询和商品信息的功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • php木马webshell扫描器代码

    php木马webshell扫描器代码

    因为前端时间服务器被放过 所以写了个webshell扫描器 呵呵 专杀php webshell 不管大马还是小马 包括一句话 现在放出代码来
    2012-01-01
  • PHP+Mysql+Ajax+JS实现省市区三级联动

    PHP+Mysql+Ajax+JS实现省市区三级联动

    最近做了个项目,需要用到省市区三级联动,上网翻了不少资料,于是有了下面的思路和代码
    2014-05-05
  • VB中的RasEnumConnections函数返回632错误解决方法

    VB中的RasEnumConnections函数返回632错误解决方法

    这篇文章主要介绍了VB中的RasEnumConnections函数返回632错误解决方法,使用MSDN中的例子在XP SP3系统上出现的错误,需要的朋友可以参考下
    2014-07-07
  • Laravel实现搜索的时候分页并携带参数

    Laravel实现搜索的时候分页并携带参数

    今天小编就为大家分享一篇Laravel实现搜索的时候分页并携带参数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10

最新评论