laravel框架怎么定时任务(laravel Model 执行事务的实现)
laravel框架怎么定时任务
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 执行事务的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/woshihaiyong168/article/details/70339908
- laravel在中间件内生成参数并且传递到控制器中的2种姿势(laravel在中间件内生成参数并且传递到控制器中的2种姿势)
- laravel有哪些长期支持版本(Laravel中9个不经常用的小技巧汇总)
- laravel模型使用技巧(提高Laravel应用性能方法详解)
- laravel模型个数(laravel withCount 统计关联数量的方法)
- laravel算法(laravel批量生成假数据的方法)
- laravel5.7项目实战(基于Laravel 5.2 regex验证的正确写法)
- laravel命令控制器怎么设置(Laravel获取当前请求的控制器和方法以及中间件的例子)
- laravel框架的运行机制(Laravel5框架自定义错误页面配置操作示例)
- laravel怎么设置自定义(laravel实现于语言包的完美切换方法)
- laravel查询构建器原理和使用(阿里对象存储OSS在laravel框架中的使用方法)
- laravel常用的辅助函数介绍(Laravel框架表单验证操作实例分析)
- laravel开发api支持多少并发(laravel框架 api自定义全局异常处理方法)
- laravel请求耗时(Laravel统计一段时间间隔的数据方法)
- laravel查询数据库视图(Laravel5.7 数据库操作迁移的实现方法)
- laravel事务状态(laravel dingo API返回自定义错误信息的实例)
- laravel查询限制输出设置(laravel validate 设置为中文的例子验证提示为中文)
- 赏读 八月再见,九月你好(赏读八月再见九月你好)
- 散文 八月再见,九月,我在风中等你(散文八月再见九月)
- 8月再见 9月你好(8月再见)
- 魔兽世界 设计师爆料,原始版本并无PVP,跨阵营属于返璞归真(魔兽世界设计师爆料)
- 吐槽完《弧光大作战》之后,我们和设计师聊了聊魔兽首款手游的立项初衷和未来(吐槽完弧光大作战之后)
- 魔兽争霸3自定义战役少年杰雷 2(魔兽争霸3自定义战役少年杰雷)
热门推荐
- css3常用特性(css3学习之2D转换功能详解)
- thinkphp5表单系统(thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例)
- python读取文件的正确方法(强悍的Python读取大文件的解决方案)
- 织梦dedecms建站的核心经验和技巧(dedecms模板安装教程及模板相关知识学习)
- sqlserver字符串格式化(SQL server中字符串逗号分隔函数分享)
- nginx代理转发域名(Nginx域名转发使用场景代码实例)
- 通过接口访问mysql数据库(使用mysql记录从url返回的http GET请求数据操作)
- C#如何读取Excel
- php开发的主要技术(详解PHP神奇又有用的Trait)
- 学会php的路线图(PHP进阶学习之Geo的地图定位算法详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9