请问 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 的数据库事物操作呢?
还有,文档说的又是什么意思?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《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年前 评论

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