今天在操作一个事务的时候 发现了一个奇怪的事情,在代码中开启了一个事务 然后中间操作了 2 张不同数据库的表 最后发现其中一个表不受到 commit
和 rollback
的影响 数据正常操作进去了
因为是在项目中配置了多个数据库连接 后面测试发现只有默认连接的那个 MySQL
事务才生效了 另外一个数据库的所有事务操作对它都不生效!
然后搜索了一圈发现 Laravel
下的跨库事务操作是基于连接的 当执行 DB::beginTransaction();
的时候 其实是和默认的数据库配置建立了连接 后面的操作 commit
或者 rollback
都是操作的这个默认数据库 如果在这中间操作了其他的数据库 对他是不生效的
解决方案
开始事务的时候就指定连接
同时 commit
和 rollback
都 指定连接
以 Laravel5.5
为例
增加多数据库配置
在配置目录 config/database.php
文件中的 connections
数组下 增加多数据库连接配置
|
|
给Model指定数据库连接
新建一个test数据库的连接基类
指定连接为上面配置的连接别名
|
|
跨库事务操作
|
|