eloquent的事务
以前没有碰到这种需求,就没在意。在eloquent的事务中,在commit之前,对对象进行save操作,再进行查询,查到的数据已经是更新之后的。代码如下
public function index(){
DB::beginTransaction();
$id = 2;
$user = User::find($id);
$user->name = 'name_after';
dump(User::find($id)->name); //① 此时name是name_before
$user->save();
dump(User::find($id)->name); //② 此时name已经是name_after
Db::commit();
dump(User::find($id)->name); //③ 我的理解是应该此时才会变更
}
我的理解是应该在Db::commit()之后,数据才会变。
实际上如果去掉commit操作,数据不会写库,但在位置②的时候,查出来的数据也已经是name_after了。
PS:数据库是postgres,隔离等级是read committed,没有问题。
我想要在位置②查出来的数据还是name_before,应该怎么做?
谢谢~
关于 LearnKu
我的理解是应该在 Db::commit() 之后,数据才会变。应该是其他事务在 本事务commit之后,才会感知数据的改变,这个是事务隔离性所表述的内容。实际上如果去掉 commit 操作,数据不会写库框架在处理事务时,如果发现了事务的开始,但没有发现commit,会默认执行rollback。PS: 数据库是 postgres,隔离等级是 read committed,没有问题。隔离级别是隔离的多个事务,不是隔离的同一个事务。。
第二点更正一下,只有通过闭包的方式执行事务,才会自动处理提交与回滚。如果手动开启事务,漏掉了
commit, 回滚动作是mysql自己来做的。