请问 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 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 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年前 评论

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