时间:2021-05-26
前言
如果大家在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法。如果在事务的闭包内抛出异常,事务将会被自动还原。如果闭包运行成功,事务将被自动提交。
你不需要担心在使用 transaction 方法时还需要亲自去手动还原或提交事务:
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete();});手动操作事务
如果你想手动处理事务并对还原或提交操作进行完全控制,则可以在 DB facade 使用 beginTransaction 方法:
DB::beginTransaction();你也可以通过 rollBack 方法来还原事务:
DB::rollBack();最后,可以通过 commit 方法来提交这个事务:
DB::commit();注意: DB facade 的事务方法也可以用来控制 查询语句构造器 及 Eloquent ORM 的事务。
示例介绍
假设有要在数据库中存储一个知识点,这个知识点同时属于两个不同的考点,也就是考点和知识点这两个数据是多对多的关系,那么要实现这种数据结构就需要三个表:
知识点表 wiki:
---------------------------------------id title content---------------------------------------考点表 tag:
-------------------id name-------------------考点知识点关联表 wiki_tag_rel
----------------------------------id tag_id wiki_id----------------------------------现在要开启事务新增Wiki数据,新增wiki成功后再把它关联到指定的考点上去
(在laravel中使用查询构建器或者Eloquent ORM执行query时,如果失败会返回 Illuminate\Database\QueryException 异常)
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;use Illuminate\Database\QueryException;use App\Wiki;class TestController extends Controller{ //用DB facade的事务方法控制 查询语句构建器的事务 public function storeWiki(Request $request) { DB::beginTransaction(); try { $tagIds = explode(',', $request->get('tag_id')); $wiki_id = DB::table('wiki')->insertGetId([ 'title' => $request->get('title'), 'content' => $request->get('content') ]); $relationData = []; foreach($tagIds as $tagId) { $data = ['wiki_id' => $wiki_id, 'tag_id' => $tagId]; $relationData[] = $data; } DB::table('wiki_tag_rel')->insert($relationData); DB::commit(); } catch(\Illuminate\Database\QueryException $ex) { DB::rollback(); return \Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']); } return \Response::json(['status' => 'ok']); } //用DB facade的事务方法控制 Eloquent ORM的事务 public function createWiki(array $data) { DB::beginTransaction(); try { $tagIds = explode(',', $data['tag_id']); $newWiki = Wiki::create([ 'title' => $data['title'], 'content' => $data['content'] ]); //Wiki和Tag两个Model使用了belongsToMany建立了多对多的关系 //通过attach方法来附加wiki和tag的关系(写入中间表) $newWiki->tags()->attach($tagIds); DB::commit(); } catch(QueryException $ex) { DB::rollback(); return \Response::json(['status' => 'error', 'error_msg' => 'Failed, please contact supervisor']); } return \Response::json(['status' => 'ok']); }}总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Mysql事务操作失败如何解决事务的原子性:事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做。要实现事务的原子性,单单靠一条commit或是r
1、事务Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。最终都是调用数据库连接来完成事务的开启、提交和
springBoot使用事务非常简单,首先使用注解@EnableTransactionManagement开启事务支持后,然后在访问数据库的Service方法上
一、事务的基本原理Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事
在数据库编程中,事务是经常需要用到的技术,在.net平台上,事务处理是非常好用的,但是在SqlServer数据库的存储过程中如何使用事务来完成数据的批量操作呢?