请问 DB facade 到底能不能实现 Eloquent ORM 的数据库事物操作?

我是用 Eloquent ORM 操作的数据库,现在遇到了需要向2张表插入信息的原子操作(一张是文章列表,另一张是文章内容表)。
显然,这两个插入应该是原子操作,我尝试着用 DB facade 来实现,如下:

DB::transaction(function () {
    articleModel::create():
    articleContentModel::create():
});

第二种方法:

DB::beginTransaction();
try{
    articleModel::create():
    articleContentModel::create():
    DB::commit();
}catch(\Exception $e){
    DB::rollBack();
}

这些代码虽然都能运行,但是都没有实现原子操作。
而且我还试了把 DB 换成我创建的 model,发现提示对象没有此方法。
但是文档里又清楚的说明了:

使用 DB facade 的事务方法也适用于 查询语句构造器 and Eloquent ORM。

引用位置点此
那么, DB facade 到底能不能实现 Eloquent ORM 的数据库事物操作呢?
还有,文档说的又是什么意思?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5

我觉得这是中文用词理解有歧义的锅:joy:

英文原版是这样的:

Using the DB facade's transaction methods also controls transactions for the query builder and Eloquent ORM.

译者的“适用于”并不是指Eloquent ORM用有transaction方法。

生硬一点的翻译就是:使用DB facade的transaction方法也能为查询构造器和Eloquent ORM提供事务控制。

6年前 评论
leo
  1. 确认你的数据库引擎支持事务
  2. 你通过什么判断这两份代码不是原子操作?
6年前 评论

@leo 2个表分两次插入,第二表我故意把一个字段设为空。在一次表单提交中,第一个表有记录,第二个表没有记录,并报错。
另外,我的数据库是mysql,不能支持事务吗?

6年前 评论
leo

@树梢的阳光 如果数据库引擎是 myisam 的话就不支持

6年前 评论

@树梢的阳光 是这样的,DB 有默认的数据库连接,它只能保护和它连接的数据库。如果 articleModel 或者 articleContentModel 所在的数据库和 DB 默认数据库不相同, DB 是没办法进行事务的。
这种情况的解决方法就是写两个 beginTransaction;

DB::beginTransaction();
DB::connection('db2')->beginTransaction();
try{
    articleModel::create():
    articleContentModel::create():
    DB::commit();
   DB::connection('db2')->commit();
}catch(\Exception $e){
    DB::rollBack();
   DB::connection('db2')-> rollBack();
}
6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!