【发布时间】:2015-11-12 17:06:34
【问题描述】:
我很难理解为什么不提交两个事务。
我有一个运行 MYSQL 数据库且禁用自动提交的应用程序;
在一个请求期间,我做了两笔交易,比如说:
public function createDownload($user_id,$filename,$path){
$response = null;
try {
DB::transaction(function () use ($filename,$path,$user_id) {
$output = DB::table($this->table)->insert(array('file_name' => $filename, 'path' => $path,'user_id'=>$user_id));
$this->response = $output;
});
DB::commit();
DB::disconnect('mysql');
return $this->response;
} catch (Exception $e) {
DB::rollback();
Log::error($e->getMessage());
return False;
}
}
public function finishedDownload($filename,$path){
DB::reconnect('mysql');
$response = null;
try {
DB::transaction(function () use ($path) {
$output = DB::table($this->table)->where('path', '=', $path)->update(array('status'=>1));
$this->response = $output;
});
Log::info($this->response);
DB::commit();
return $this->response;
} catch (Exception $e) {
DB::rollback();
Log::error($e->getMessage());
return False;
}
}
在这种情况下,假设在来自用户的一个请求中,控制器 A 在同一个请求中调用这两个方法:
createDownload(1,toto,toto/toto);
----
----
lines of code
----
----
finishedDownload(toto,toto);
基本上应该是,在第一种方法中,插入记录,几行代码后,更新同一条记录。
但是!它插入记录并提交,但是当假设要更新它时,它不会更新记录! 当我检查更新后查询返回的内容时,它返回 1 确认查询继续进行,但它不执行 commit();
谁能解释一下原因,以及如何修复这个错误?
谢谢!
【问题讨论】:
-
为什么要断开连接并重新连接?你为什么不使用雄辩的查询?为什么要对单个查询使用事务然后结束这些事务?
-
(无法编辑最后一条评论):事务用于数据完整性——这意味着只有在运行多个应该一起成功执行或根本不执行的查询时才需要它们。将它们用于单个事务是不必要的,并且会使用它不需要的资源。 Eloquent 会让你的生活变得更加轻松。
-
从数据库断开连接将回滚任何未完成的事务,除非您使用持久连接(坏主意)。当您重新连接时,不能保证您会获得与第一个查询使用的相同的连接,这意味着您可能会连接到一些完全不同的事务。
-
如果我的数据库禁用了自动提交功能,我如何在不执行事务的情况下提交代码中的任何更改?
-
DB::beginTransaction() 然后提交和回滚。
标签: php mysql database laravel transactions