事务的概念:
1.
原子性(
A
):
对于数据修改,要么全部都执行,要么全都不执行。
2.
隔离性(
C
):
在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程。
3.
一致性(
I
):
事务发生前和发生后,根据数据的规则,总额应该匹配。
4.
持久性(
D
):
事务一旦被提交,其结果就是永久性的,系统崩溃也不会影响
laravel中使用事务
1、第一种方式:事务闭包
use Illuminate\Support\Facades\DB;
DB::transaction(function () {
//这里面写逻辑
});
2、第二种方式:常规方式
use Illuminate\Support\Facades\DB;
//开启事务
DB::beginTransaction();
try{
//中间逻辑代码
DB::commit();
}catch (\Exception $e) {
//接收异常处理并回滚
DB::rollBack();
}
应用场景:
使用场景一般涉及到个人财务信息的时候都会使用到,比如上图的积分计算
,
还有订单购物车等
为啥要用到事务?
比如购买VIP会员商品支付成功后的一个操作:
1、是否减金币;2、经营者结算;3、购买vip的操作比如vip时间,身份
问题就出现了,数据库执行完1,2俩个步骤,3步骤出现错误,比如说系统奔溃了,这时候会出现bug.
用户钱被扣了,经营者拿到钱了但VIP缺没有充值成功。所以要用事务捆绑这几个动作,如果1,2,3有错误发生,则回滚数据库
DB::beginTransaction();
try{
//中间逻辑代码
#减金币
$this->PaySuccessRepo->lessBjCoin($order);
#经营者结算
$this->PaySuccessRepo->operatorsAddBjCoin($order,$user);
#买vip操作
$this->PaySuccessRepo->buyVip($user);
DB::commit();
}catch (\Exception $e) {
//接收异常处理并回滚
\Log::error($e->getMessage());
DB::rollBack();
return $e->getMessage();
}