Answers:
你可以这样做:
DB::transaction(function() {
//
});
关闭内部的所有事务都在事务内执行。如果发生异常,它将自动回滚。
Discussed in more detail here
链接已死。
如果您不喜欢匿名函数:
try {
DB::connection()->pdo->beginTransaction();
// database queries here
DB::connection()->pdo->commit();
} catch (\PDOException $e) {
// Woopsy
DB::connection()->pdo->rollBack();
}
更新:对于laravel 4,该pdo
对象不再公开,因此:
try {
DB::beginTransaction();
// database queries here
DB::commit();
} catch (\PDOException $e) {
// Woopsy
DB::rollBack();
}
DB::beginTransaction()
和DB::commit()
&DB::rollback()
。那会更清洁一点。
DB::connection()->getPdo()->beginTransaction();
DB::transaction
with回调更加干净,但是缺点是,如果您需要为不同的异常指定不同的处理程序,则必须返回尝试/捕获技术
如果您想使用Eloquent,也可以使用
这只是我项目中的示例代码
/*
* Saving Question
*/
$question = new Question;
$questionCategory = new QuestionCategory;
/*
* Insert new record for question
*/
$question->title = $title;
$question->user_id = Auth::user()->user_id;
$question->description = $description;
$question->time_post = date('Y-m-d H:i:s');
if(Input::has('expiredtime'))
$question->expired_time = Input::get('expiredtime');
$questionCategory->category_id = $category;
$questionCategory->time_added = date('Y-m-d H:i:s');
DB::transaction(function() use ($question, $questionCategory) {
$question->save();
/*
* insert new record for question category
*/
$questionCategory->question_id = $question->id;
$questionCategory->save();
});
question->id
事务回调中的表达式返回零。
如果您想避免闭包,并乐于使用立面,则可以使事情保持整洁:
try {
\DB::beginTransaction();
$user = \Auth::user();
$user->fill($request->all());
$user->push();
\DB::commit();
} catch (Throwable $e) {
\DB::rollback();
}
如果有任何语句失败,则提交将永远不会执行,并且事务也不会处理。
由于某些原因,在任何地方都很难找到该信息,所以我决定将其发布在这里,因为我的问题虽然与Eloquent交易有关,但正好改变了这一点。
阅读了这个 stackoverflow的答案之后,我意识到我的数据库表使用的是MyISAM而不是InnoDB。
为了使事务在Laravel上(或其他任何地方)运行,需要将表设置为使用InnoDB
为什么?
引用MySQL 事务和Atomic Operations文档(此处):
MySQL服务器(版本3.23-max和所有版本4.0及更高版本)支持使用InnoDB和BDB事务存储引擎的事务。InnoDB提供了完全的ACID合规性。请参阅第14章,存储引擎。有关InnoDB与标准SQL在事务错误处理方面的区别的信息,请参见第14.2.11节“ InnoDB错误处理”。
MySQL Server中的其他非事务性存储引擎(例如MyISAM)遵循称为“原子操作”的数据完整性的另一范式。用事务术语来说,MyISAM表始终始终在自动提交= 1模式下运行。原子操作通常提供可比的完整性和更高的性能。
因为MySQL Server支持这两种范例,所以您可以决定通过原子操作的速度还是使用事务功能来最好地服务于应用程序。可以按表进行选择。