Laravel雄辩的ORM交易

雄辩ORM是相当不错的,虽然我想知道是否有一个简单的方法来设置MySQL交易使用innoDB与PDO相同的方式,或者如果我不得不延长ORM使这成为可能?

你可以这样做:

DB::transaction(function() { // }); 

Closure内的所有东西都在事务中执行。 如果发生exception,它将自动回滚。

如果你不喜欢匿名函数:

 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(); } 

如果你想使用雄辩,你也可以使用这个

这只是我的项目的示例代码

  /* * 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('Ymd H:i:s'); if(Input::has('expiredtime')) $question->expired_time = Input::get('expiredtime'); $questionCategory->category_id = $category; $questionCategory->time_added = date('Ymd H:i:s'); DB::transaction(function() use ($question, $questionCategory) { $question->save(); /* * insert new record for question category */ $questionCategory->question_id = $question->id; $questionCategory->save(); }); 

如果你想避免closures,并乐意使用外墙,下面的东西保持干净整洁:

 \DB::beginTransaction(); $user = \Auth::user(); $user->fill($request->all()); $user->push(); \DB::commit(); 

如果任何语句失败,提交将不会被触发,并且事务将不会被处理。

出于某种原因,在任何地方都很难find这个信息,所以我决定在这里发表,因为我的问题,虽然涉及到雄辩的交易,正在改变这一点。

读完这个 stackoverflow答案后,我意识到我的数据库表使用MyISAM而不是InnoDB。

对于Laravel(或者其他任何地方)的事务,需要将表设置为使用InnoDB

为什么?

引用MySQL 交易和primefaces操作文档( 在这里 ):

MySQL Server(版本3.23-max和所有版本4.0及以上)支持与InnoDB和BDB事务存储引擎的交易。 InnoDB提供完整的ACID合规性。 请参阅第14章,存储引擎。 有关InnoDB与标准SQL在处理事务错误方面的差异的信息,请参见第14.2.11节“InnoDBerror handling”。

MySQL服务器中的其他非事务性存储引擎(如MyISAM)遵循不同的称为“primefaces操作”的数据完整性范例。在事务条款中,MyISAM表总是以自动提交= 1模式运行。 primefaces操作通常提供可比较的完整性和更高的性能。

由于MySQL服务器支持这两种范例,因此您可以根据primefaces操作的速度或使用事务function来决定应用程序的最佳服务。 这个select可以在每张桌子上进行。

我敢肯定,你不是在寻找一个封闭的解决scheme,试试这个更紧凑的解决scheme

  try{ DB::beginTransaction(); /* * Your DB code * */ DB::commit(); }catch(\Exception $e){ DB::rollback(); } 

如果发生任何exception,事务将自动回滚。

Laravel基本交易格式

  try{ DB::beginTransaction(); /* * SQL operation one * SQL operation two .................. .................. * SQL operation n */ DB::commit(); /* Transaction successful. */ }catch(\Exception $e){ DB::rollback(); /* Transaction failed. */ }