Laravel数据库事务

本文做一个Laravel数据库事务的介绍。

 事务将一堆的数据库操作组合到一个工作单元中执行


 、事务的四个特性

1、原子性(atomicity)原子性是指整个数据库事务是不可分割的工作单位。
2、一致性(consistency)一致性指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。

3、隔离性(isolation)一个事务的影响在该事务提交之前对其他事务都不可见------这通过锁来实现。

4、持久性(durability)事务一旦提交,其结果就是永久性的。


Mysql中的存储引擎

1Mysql服务器层不管理事务,事务是由下层的存储引擎实现的。

2在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

而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 方法:

 
 
DB::beginTransaction();
您可以通过 rollBack 方法回滚事务:

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 的事务。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值