laravel 解决多库下的DB::transaction()事务失效问题

问题:最近使用laravel的DB::transaction()方法进行事务操作时,发现事务总是无效的。代码如下:

DB::transaction(function () use ($uid, $roleId) {
 RoomUserRole::insert([
  'uid' => $uid,
  'role_id' => $roleId,
  'created_at' => LARAVEL_START,
  'updated_at' => LARAVEL_START
 ]);

 RoomUserRoleLog::insert([
  'uid' => $uid,
  'handle_type' => 1,
  'admin_uid' => Auth::user()->id,
  'created_at' => LARAVEL_START,
  'updated_at' => LARAVEL_START
 ]);

});

以上mysql 第二句会报错抛出一个异常, 查看数据库时第一句依然出入成功。查看laravel的DB::transaction()的使用

原因以及解决方法:

项目使用多个数据库配置,DB::transaction()使用的是默认库的事务操作。所以要指定哪个数据库的事务,以上代码调整:

DB::connection('mysql2')->transaction(function () use ($uid, $roleId) {
 RoomUserRole::insert([
  'uid' => $uid,
  'role_id' => $roleId,
  'created_at' => LARAVEL_START,
  'updated_at' => LARAVEL_START
 ]);

 RoomUserRoleLog::insert([
  'uid' => $uid,
  'handle_type' => 1,
  'admin_uid' => Auth::user()->id,
  'created_at' => LARAVEL_START,
  'updated_at' => LARAVEL_START
 ]);

}); // 这样你会发现事务才正常回滚

同样

DB::connection('mysql_chat_room')->beginTransaction();
DB::connection('mysql_chat_room')->commit();
DB::connection('mysql_chat_room')->rollBack(); // 指定库,不然都会跑默认配置库的事务

以上这篇laravel 解决多库下的DB::transaction()事务失效问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • laravel Model 执行事务的实现

    1.官方手册是这样介绍的: 想要在一个数据库事务中运行一连串操作,可以使用DB门面的transaction方法,如果事务闭包中抛出异常,事务将会自动回滚.如果闭包执行成功,事务将会自动提交.使用transaction方法时不需要担心手动回滚或提交: DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); }); 手动使用事务 如果你想要手

  • 在laravel中实现事务回滚的方法

    之前做项目用到了事务回滚这个机制.我把代码贴出来多多交流给点意见,我用的是laravel 5.1bane版本的, public static function createDeal($to_status, $params, $new_balance, $update = true) { \DB::beginTransaction(); try { $update_order_status = \DB::table('wallet_order') ->where('order_id', $para

  • laravel5 Eloquent 实现事务方式

    1.官方手册是这样介绍的: 想要在一个数据库事务中运行一连串操作,可以使用DB门面的transaction方法,如果事务闭包中抛出异常,事务将会自动回滚.如果闭包执行成功,事务将会自动提交.使用transaction方法时不需要担心手动回滚或提交: DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); }); 手动使用事务 如果你想要手

  • laravel 解决多库下的DB::transaction()事务失效问题

    问题:最近使用laravel的DB::transaction()方法进行事务操作时,发现事务总是无效的.代码如下: DB::transaction(function () use ($uid, $roleId) { RoomUserRole::insert([ 'uid' => $uid, 'role_id' => $roleId, 'created_at' => LARAVEL_START, 'updated_at' => LARAVEL_START ]); RoomUserRo

  • 解决Laravel5.5下的toArray问题

    作为一个有轻度强迫症且受ThinkPHP影响较深的PHP码农,总觉得Laravel5.5的DB::xxoo->get()->toArray()之后竟然还没得到我想要的ThinkPHP中的select()出来的数组,于是决定做一下修改. PS:出于尽量不影响原有框架的考虑,我是新建了一个方法叫getList来暂代toArray那不知所谓的返回结果,在没有找到更好的解决办法之前,暂时这么用着,总体感觉,get()->getList()仍觉得略丑.... 具体修改如下: 1.在/vendor/

  • laravel 解决路由除了根目录其他都404的问题

    环境:ubuntu14.04 apache2 php5.6 laravel5.5 ip/yourprojectname/public 可以正常访问 而ip/yourprojectname/public/api/youractionname 显示404 apache的rewrite模块已经启用 怀疑是public下面的.htaccess不起作用 打开/etc/apache2/apache2.conf修改成如下(None改成All) OK! 问题解决! 以上这篇laravel 解决路由除了根目录其他

  • 解决laravel5.4下的group by报错的问题

    使用ORM查询数据显示这个错,这是因为laravel使用了开启了mysql的严格模式所以 如果要关闭的话,我们需要找到config/database.php这个文件,然后将 mysql下的这个改为false;就会关闭. 既然说严格模式那什么是样模式呢.据我所知在mysql在5.7有一个尿性 [报错:only_full_group_by],就是你group by的数据里面必须包含你查询的数据,意思就是如果你的sql是:select name,age from user group by name;

  • laravel 解决paginate查询多个字段报错的问题

    用laravel 框架想实现一个分页接口,返回数据表中其中一部分字段 $list = DB::table('booklist_table')->orderBy('create_time','asc')->paginate($size,['id','title','author','image'])->toJson(); return json_decode($list,true); 结果运行报错 "SQLSTATE[42000]: Syntax error or access

  • Laravel 解决composer相关操作提示php相关异常的问题

    Laravel 的一大特色就是使用 composer 来管理依赖包,这使得整个项目的升级.扩展变得异常容易.一般情况下,只需要我们输入几个命令并按下回车,就能完成插件包的安装.更新以及卸载工作. 但有时候你会碰到一种比较有意思的问题.那就是使用 composer 进行相关安装.更新插件操作的时候,却报 PHP 程序异常.比如,github中一个项目,在你上次更新之后上游代码又加入新功能,使用了一个新的依赖包.这时你使用git pull更新代码后,依赖包并没有安装,那么再用composer upd

  • laravel 解决crontab不执行的问题

    最近在写laravel的时候遇到一个定时器的问题 手动的执行 php /usr/share/nginx/html/mylaravel/artisan schedul:run 可以生效 但是写在定时器中却不执行 * * * * * php /usr/share/nginx/html/mylaravel/artisan schedul:run 先看下代码 /app/Console/Commands/test.php 1.设置 $signature 属性 protected $signature =

  • 解决tomcat部署下的web项目网页更改不能自动刷新的问题

    tomcat项目中网页上做了改动,然而浏览器刷新并没有卵用,很是烦,在网上也查找了很多答案,说需要个更改在server.xml里面的context标签中有一个reloadable="true",,然而我的就是true的显然不是这个问题,就是刷新不了 没办法,就发呆啊,肯定是tomcat的原因,无意间我双击了server,就是下面这个: 然后到达了tomcat设置的页面: 可能有各种原因吧,我的无法刷新页面就是上面的选项选错了,希望对你有所帮助! 以上这篇解决tomcat部署下的web项

  • 解决iOS11图片下拉放大出现信号栏白条的bug问题

    废话不多说了,具体解决方法如下所示: if(@available(iOS11.0, *)) { self.tableView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever; }else{ // Fallback on earlier versions self.automaticallyAdjustsScrollViewInsets=NO; } 项目中很多下拉图片放大的效果,使用上面官方给出的iOS1

  • 快速解决boost库链接出错的问题(分享)

    安装完最新的Boost库 官方说明中有一句话: Finally, $ ./b2 install will leave Boost binaries in the lib/ subdirectory of your installation prefix. You will also find a copy of the Boost headers in the include/ subdirectory of the installation prefix, so you can hencefo

随机推荐