【Laravel】数据库事务
来源:互联网 发布:windows xp翻墙 编辑:程序博客网 时间:2024/06/05 04:23
最近公司项目集成了一个支付的模块。由于网络世界是不确定的。说不定哪个操作就出了问题。为了保证数据的正确性我们不得不考虑使用数据库事务这一特性。本文做一个Laravel数据库事务的介绍。
知识回顾
二 、事务的四个特性
1、原子性(atomicity)原子性是指整个数据库事务是不可分割的工作单位。
2、一致性(consistency)一致性指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。
3、隔离性(isolation)一个事务的影响在该事务提交之前对其他事务都不可见------这通过锁来实现。
4、持久性(durability)事务一旦提交,其结果就是永久性的。
三、Mysql中的存储引擎
1、Mysql服务器层不管理事务,事务是由下层的存储引擎实现的。
2、在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。
3、Mysql提供了两种事务型的存储引擎:InnoDB和NDB Cluster,而MyISAM不支持事务。
四、死锁
1.什么是死锁?死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。
2.为什么要避免死锁?导致慢查询
3.如何解决?Mysql提供了死锁检测和死锁超时机制,
Laravel中的事务
方式一:闭包方式实现事务
您可以在 DB facade 上使用 transaction 方法,在数据库事务中运行一组操作。如果在事务 Closure 中抛出一个异常,那么事务将自动回滚。如果 Closure 成功执行,事务将自动被提交。您不需要担心在使用事务方法时手动回滚或提交。//模拟用户233向用户666转账1元DB::transaction(function () { DB::table('transactions')->where('user_id',666)increment('blance' , 1); DB::table('transactions')->where('user_id',233)->decrement('balance' , 1);});
transaction 方法接受一个可选的第二个参数,该参数定义在发生死锁时,应该重新尝试事务的次数。一旦这些尝试都用尽了,就会抛出一个异常:DB::transaction(function () {
DB::table('transactions')->where('user_id',666)increment('blance' , 1);
DB::table('transactions')->where('user_id',233)->decrement('balance' , 1);
}, 3);
如果闭包内部需要调用外部的参数可以使用下面的方式向闭包传参:
DB::transaction(function use ($amount) () {
DB::table('transactions')->where('user_id',666)increment('blance' , $amount);
DB::table('transactions')->where('user_id',233)->decrement('balance' , $amount);
}, 3);
方式二:手动操作事务
如果您想要手工开始一个事务,并且对回滚和提交有完全的控制,那么您可以在 DB facade 上使用:beginTransaction 方法:
您可以通过 rollBack 方法回滚事务:DB::beginTransaction();
DB::rollBack();
最后, 您可以通过 commit 方法提交事务,当事务进行提交(commit)或者回滚(rollBack)时都会取消锁:
DB::commit();
例子如下:
DB::beginTransaction();//开启事务try { //这里省略了业务逻辑代码
if($isSuccess){
DB::commit();//成功,提交事务
}
//思考->如果事务开启不提交会发生什么后果???} catch(\Illuminate\Database\QueryException $ex) { DB::rollback();//失败,回滚事务 echo 'error';}echo 'success';
注意:使用
DB
门面的事务方法还可以用于控制查询构建器和 Eloquent ORM 的事务。
如果MySQL存在没有提交的事务,那么这时候 AUTOCOMMIT 自动提交的参数应该是为 0 的。如果通过其他的语言的MySQL驱动来操作的话,这些驱动一般都带有自动恢复 AUTOCOMMIT 的功能,在请求处理完成后会自动 ROLLBACK 没有处理的事务。
阅读全文
0 0
- Laravel数据库事务
- 【Laravel】数据库事务
- 在Laravel中使用数据库事务以及事务失败后的异常处理
- Laravel添加事务
- laravel 事务与锁
- laravel Model 执行事务
- Laravel之事务
- laravel数据库
- Laravel 数据库
- laravel数据库迁移
- laravel中数据库迁移
- laravel 数据库操作
- laravel数据库迁移详解
- laravel--4 数据库操作
- laravel ORM 打印数据库
- laravel 之 数据库
- Laravel 数据库迁移
- Laravel操作数据库
- Alpha-beta剪枝-井字棋
- Codeforces Round #453 (Div. 2) A
- java多线程[9]:线程池(ExecutorService)
- 汇编语言的执行过程
- 离合器预减振超载造成变速箱怠速异响matlab仿真分析
- 【Laravel】数据库事务
- random模块有关
- 坚持#第247天~sed和awk进阶
- 【ASM】Oracleasm命令
- hdu1007 Quoit Design 【计算几何+分治】
- servlet介绍
- ImportError: libcudnn.so.6: cannot open shared object file: No such file or directory
- Mali GPU-抽象机器
- 使用线程wait与notify开发阻塞queue