结论前置:
Laravel框架下的事务回滚基于数据库连接(app/config/database.php->connections);
在开启事务时,如果不指定数据库连接,默认开启app/config/database.php->default中指定的连接;
所以,当表来自多个数据库连接时,其他数据库连接未开启事务,回滚失败。
代码示范:
A.手动使用事务:
//开启DatabaseA数据库的事务
DB::connection(‘DatabaseA’)->beginTransaction();
//开启DatabaseB数据库的事务
DB::connection(‘DatabaseB’)->beginTransaction();
//中间各种数据库操作try{
TableA::xxxxxx();
TableB::xxxxxx();
//一起提交
DB::connection(‘DatabaseA’)->commit();
DB::connection(‘DatabaseB’)->commit();
} catch(\Exception $e){
//一起回滚
DB::connection(‘DatabaseA’)->rollback();
DB::connection(‘DatabaseB’)->rollback();
}
B.自动使用事务:
DB::connection(‘DatabaseA’)->transaction(function () {
TableA::xxxxxx();
DB::connection(‘DatabaseB’)->transaction(function () {
TableB::xxxxxx();
});
});
Laravel不光实现了事务,还使用savepoint保存点来做到事务嵌套的操作。