-
2020-09-24 13:02:29
laravel处理事务,Eloquent ORM是不支持的,必须使用DB::
数据库事务处理#
你可以使用
transaction
方法,去执行一组数据库事务处理的操作:DB::transaction(function() { DB::table(‘users‘)->update([‘votes‘ => 1]); DB::table(‘posts‘)->delete(); });
注意: 在
transaction
闭包若抛出任何异常会导致事务自动回滚。有时候你可能需要自己开始一个事务:
DB::beginTransaction();
你可以通过
rollback
的方法回滚事务:DB::rollback();
最后,你可以通过
commit
的方法提交事务:DB::commit();
获取连接#
若要使用多个连接,可以通过
DB::connection
方法取用:$users = DB::connection(‘foo‘)->select(...);
你也可以取用原始底层的 PDO 实例:
$pdo = DB::connection()->getPdo();
有时候你可能需要重新连接到特定的数据库:
DB::reconnect(‘foo‘);
如果你因为超过了底层 PDO 实例的
max_connections
的限制,需要关闭特定的数据库连接,可以通过disconnect
方法:DB::disconnect(‘foo‘);
查找日志记录#
Laravel 可以在内存里访问这次请求中所有的查找语句。然而在有些例子下要注意,比如一次添加 大量的数据,可能会导致应用程序耗损过多内存。 如果要启用日志,可以使用
enableQueryLog
方法:DB::connection()->enableQueryLog();
要得到执行过的查找纪录数组,你可以使用
getQueryLog
方法:$queries = DB::getQueryLog();
官方手册说明:https://learnku.com/docs/laravel/5.6/database/1397#database-transactions
更多相关内容 -
Laravel事务处理
2020-05-14 12:32:48Laravel事务处理事务处理laravel事务处理的两种常用方法方法一:方法二:我用的时候,需要一个while循环,所以就这样:小知识 事务处理 对数据库进行多次操作,要么都成功,要么都回滚,就用到了事务处理. laravel事务处理...事务处理
对数据库进行多次操作,要么都成功,要么都回滚,就用到了事务处理.
laravel事务处理的两种常用方法
方法一:
DB::beginTransaction();//开启事务,不需要引入文件; try { $sql_one = DB::table('xxxxxx')->insert($row_one);//转移 $sql_two = DB::table('yyyyyy')->where('message_id', $aaa)->delete();//删除 DB::commit(); }catch (\Exception $e){ DB::rollBack(); throw $e; }
方法二:
DB::beginTransaction();//开启事务,不需要引入文件; $sql_one = DB::table('xxxxxx')->insert($row_one);//转移 $sql_two = DB::table('yyyyyy')->where('message_id', $aaa)->delete();//删除 if ($sql_two && $sql_two) { DB::commit(); return 1; } else { DB::rollBack(); return 0; }
我用的时候,需要一个while循环,所以就这样:
DB::beginTransaction();//开启事务,不需要引入文件; try { while (true) { // 这里看上去这个循环会一直执行 $row_one = DB::table('yyyyyy')->where('release_date', '<', $mothTime)->first(); if ($row_one) { $row_one = (array)$row_one; $aaa = $row_one['message_id']; $row_two = DB::table('xxxxxx')->insert($row_one);//转移 $row_three = DB::table('yyyyyy')->where('message_id', $aaa)->delete();//删除 DB::commit(); }else { break; } } }catch (\Exception $e){ DB::rollBack(); }
小知识
while循环放在try里面,当循环某个环节出错时,直接抛出异常停止循环
try放在while循环里面,当循环某个环节出错时,抛出异常后继续循环. -
laravel 事务处理逻辑
2019-12-11 18:05:32laravel事务处理逻辑前言:
在操作数据库中,实现一个功能时有时候会多次操作数据库,
在多次操作数据库时,就会有可能出现其中一条sql语句执行成功,而另一条sql语句执行失败。
这样的话就会出现很严重的问题,所以可以用MySQL的事务处理来解决这个问题。!!:在处理多表操作的时候一般是需要用到事务处理的!
//1、开启事务 DB::beginTransaction(); try{ //2、执行成功时提交事务 DB::commit(); }catch(\Exception $exception){ //3、执行成失败时回滚 DB::rollBack(); }
注意:
其中要注意一点的是,catch里面的抛出异常,Exception前面要加上一个‘\’,不然的话在框架里面他会找不到这个类,然后就不会抛出异常。框架就会直接报错,起不到事务的作用。//用户注册demo <?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; class LoginController extends Controller { public function register(Request $request) { $rules = [ 'mobile' => 'required',//laravel-sms 'password' => 'required|confirmed|min:8', ]; $msg = [ 'mobile.required' => '请输入手机号码', 'password.required' => '请输入密码', ]; $validator = Validator::make($request->all(), $rules, $msg); if ($validator->fails()) { $this->throwValidatorException($validator); } $mobile = $request->input('mobile'); $password = $request->input('password'); //手机号码查重 $user = User::where('mobile', $mobile)->first(); if ($user) { return $this->errorWithInfo('手机号码已存在'); } DB::beginTransaction(); try{ $user = User::create([ 'mobile' => $mobile, 'password' => Hash::make($password), ]); //用户仓库,创建用户的时候 赋予用户道具 土地等属性(在仓库表中体现) UserTool::create([ 'uid' => $user->id, 'tool_id' => Daoju::TOOL_SEEDER, 'pay_time' => Carbon::now()->timestamp, 'nums' => 1, ]); DB::table('oauth_access_tokens')->where('user_id', $user->id)->update(['revoked' => 1]); DB::commit(); return $this->proxy($mobile, $password); } catch (\Exception $exception) { DB::rollBack(); return $this->errorWithInfo($exception->getMessage()); } } }
-
laravel学习笔记--事务处理
2021-09-01 20:03:57换句话说,如果在处理过程中发生了异常,就会回滚到处理之前。 比如,在删除一篇文章时,删除了一篇文章的话,是不是还要删除与它相关的评论,如果在删除文章过程中发生了异常,那么这些评论就会造成数据堆积,造成...数据库事务
可以使用 DB facade 的 transaction 方法在数据库事务中运行一组操作。如果事务的闭包 Closure
中出现一个异常,事务将会回滚。如果事务闭包 Closure 执行成功,事务将自动提交。一旦你使用了 transaction ,
就不必担心手动回滚或提交的问题换句话说,如果在处理过程中发生了异常,就会回滚到处理之前。
比如,在删除一篇文章时,删除了一篇文章的话,是不是还要删除与它相关的评论,如果在删除文章过程中发生了异常,那么这些评论就会造成数据堆积,造成大量的垃圾数据,就会拖慢我们的服务器运行,所以,使用事务可以处理这些问题DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
死锁
transaction 方法接受一个可选的第二个参数 ,该参数用来表示事务发生死锁时重复执行的次数。一旦定义的次数尝试完毕,就会抛出一个异常
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); }, 5);
手动使用事务
有时候我们不需要使用闭包的方式,我们需要的是自己去控制数据提交和事务处理,那么,就会使用到手动使用事务
如果你想要手动开始一个事务,并且对回滚和提交能够完全控制,那么你可以使用 DB Facade 的 beginTransaction 方法
手动使用事务的话,是要自己开启事务的
DB::beginTransaction();//开启事务
手动使用事务流程
//手动使用事务 DB::beginTransaction();//开启事务 try { //这里是数据库操作,一旦这里发送错误, //就会抛出异常,就不会到提交那一步 //提交数据--无异常才可以提交 DB::commit(); }catch (\Exception $e){ //进行回滚操作 DB::rollBack(); }
例如,我删除文章的同时再删除评论
//开启事务 DB::beginTransaction(); try { //删除博客 $blog->delete(); //删除博客相关评论 $blog->comments()->delete(); //提交事务 DB::commit(); return response()->api('删除成功'); } catch (\ Exception $e) { //回滚 DB::rollBack(); return response()->api('删除失败', 400); }
-
laravel 事务无效 处理
2021-01-20 22:59:57laravel 事务无效直接上两次无效代码:DB::beginTransaction();$sql1=DB::table('user')->delete($id);$sql2=DB::table('user2')->where('id',$id)->update(['state'=>1]);if($sql1!=0and$sql2!=0){DB::c... -
Laravel 事务处理传递参数与添加数据后如何返回主键
2018-09-10 23:06:45传递参数使用匿名函数use来传递参数,参考( ...); 返回添加数据的主键可以用 $aid->id 方式返回;...Laravel 事务处理文档 https://laravel-china.org/docs/laravel/5.6/database/1397#09ddab -
Laravel 事务:封装自己的 incrementGetValue 方法
2020-12-05 17:50:52目录 一、mysql 8.0 的隔离级别 1、4 种 隔离级别 2、设置 隔离级别 二、Lareavel 事务 1、事务测试 2、测试过程 三、封装自己的 incrementGetValue 方法 1、\App\Http\Controllers\Test\TestController 2、\... -
1. 关于laravel中事务嵌套问题
2022-01-04 11:09:34开启两次事务,第一次事务未做任何操作,开启第一次事务,导致第二次事务任何操作未起任何作用。mysql隐式提交失效 DB::beginTransaction(); EmailRecord::where("send_status", EmailRecord::SEND_STATUS_WAIT) ... -
Laravel 事务中使用悲观锁
2021-01-19 09:34:25laravel 提供了方便快捷的数据库事务...但如果我们在使用 laravel 提供的 sharedLock 或者 lockForUpdate 锁表的方式,为了避免不必要的麻烦和错误,建议最好使用手动提交事务来处理,如下图:下面来说说 sharedLock... -
laravel单数据库执行事务和多数据库执行事务
2020-12-18 17:39:39单数据库使用 //开启事务 Db::startTrans(); try{ //一些数据库操作 Users::delete($id); DB::commit();//提交 }catch (\Exception $e) { DB::rollBack();//回滚 return $e->getMessage(); } return '操作成功'... -
laravel事务控制处理
2018-12-03 14:21:24在我们的业务处理中,有时候会遇到多个SQL语句的操作,并且他们是分开执行的,有时候他们是存在互相关联的,比如A表新添了一条记录,B表要对该记录进行关联,如果我们不对他们进行事务的控制,将有可能在突发的情况下... -
laravel框架中的MySQL事务处理
2021-02-03 03:45:54这样的话就会出现很严重的问题,所以可以用MySQL的实物处理来解决这个问题。laravel中的事物:假如说:有一个用户表(user)里面有两个字段,username,passwordpassword字段设置为char(32),固定长度。现在想要一次性... -
Laravel 分布式事务处理
2020-05-24 16:31:43TCC 是现在非常流行分布式处理模式,属于柔性事务。柔性事务,基于分布式领域 BASE 理论,它是在 CAP 理论(一致性、可用性、分区容忍性)的基础之上的延伸,包括:基本可用(Basically Available)、柔性状态(Soft... -
Laravel中的事务处理
2019-01-12 19:28:00Laravel中的事务可以用 DB 门面的 transaction 方法在一个事务里执行一系列操作。如果事务闭包里抛出异常,那么事务就会自动回滚。如果闭包执行成功,那么事务就会自动提交。使用 transaction 方法就无需手动回滚... -
在Laravel中使用数据库事务以及事务失败后的异常处理
2017-12-09 14:34:43laravel想要在一个数据库事务中运行一连串操作,可以使用DB门面的transaction方法,如果事务闭包中抛出异常,事务将会自动回滚。如果闭包执行成功,事务将会自动提交。使用transaction方法时不需要担心手动回滚或... -
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2021-01-27 04:19:05前言如果大家在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法。如果在事务的闭包内抛出异常,事务将会被自动还原。如果闭包运行成功,事务将被自动提交。你不需要担心在... -
laravel框架中的MySQL事务处理 阿星小栈
2021-01-19 17:59:52这样的话就会出现很严重的问题,所以可以用MySQL的实物处理来解决这个问题。laravel中的事物:假如说:有一个用户表(user)里面有两个字段,username,passwordpassword字段设置为char(32),固定长度。现在想要一次性... -
Laravel框架学习笔记之数据库事务
2021-01-21 08:39:40什么是事务事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。二.什么时候使用事务对数据库的数据进行批量或连表操作时,为了保证数据的一致性和正确性,我们需要添加事务... -
laravel 事务与锁
2016-10-11 20:57:12关于laravel 事务与锁机制的见解。 -
Laravel 事务中 使用 悲观锁 小结
2021-01-19 23:23:20laravel 提供了方便快捷的数据库事务使用方式,在使用中遇到过几个容易混淆和被误导的地方,这里做个记录,希望哪里写的不对的地方各位大神指点一下laravel 事务分为手动方式和自动方式,但如果我们在使用 laravel ... -
Laravel框架的事务处理
2019-01-13 19:01:04数据库事务 想要在一个数据库事务中运行一连串操作,可以使用 DB 门面的 transaction 方法,使用 transaction 方法时不需要手动回滚或提交:如果事务闭包中抛出异常,事务将会自动回滚;如果闭包执行成功,事务将会... -
在Laravel中使用数据库事务以及捕获事务失败后的异常
2021-01-25 20:32:43Description在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法。如果在事务的闭包内抛出异常,事务将会被自动还原。如果闭包运行成功,事务将被自动提交。你不需要担心在使用... -
laravel中的事务处理
2018-01-23 15:10:07你可以用 DB 门面的 transaction 方法在一个事务里执行一系列操作。如果事务闭包里抛出异常,那么事务就会自动回滚。如果闭包执行成功,那么事务就会自动提交。使用 transaction 方法就无需手动回滚或者提交... -
laravel 死锁处理机制+测试
2022-05-19 12:00:06在日常交易场景中,我们有用户A向用户B进行转账,用户B向用户A进行转账的情况,那么当两个请求并发一起执行的时候怎么办呢,首先是在事务中绑定一个死锁。 $user1 = \App\Models\User::query()->where('id',1)-&...