laravel 事务的使用会忽略的地方

laravel开启事物有两种方法:

  • 一种是闭包
1
2
3
4
5
DB::transaction(function()
{
    DB::table('user')->insert(['username'=>'xxx']);
    DB::table('comment')->insert(['content'=>'zzz']);
});

当闭包内发生错误就会自动回滚

  • 另一种比较灵活
1
2
3
4
5
6
7
DB::beginTransaction();
//这里执行一些数据库操作,包括 eloquent 的
if(condition){
    DB::commit();
}else{
    DB::rollback();
}

但是我有一次发现两种方法的事物都不起作用,在想掉几根头发之后想到了可能是不同数据库的原因!

如果你采用的是分库存储不同逻辑的方式,执行事物的时候一定要加上连接信息 上面的就要这样写了:

1
2
3
4
5
6
7
DB::connection('admin_database')->beginTransaction();
//这里执行一些数据库操作,包括 eloquent 的
if(condition){
    DB::connection('admin_database')->commit();
}else{
    DB::connection('admin_database')->rollback();
}

如果逻辑中的 eloquent 连接的数据库和开启事物的数据库不是一个库一样是不起作用的