事务主要用于处理操作量大,较复杂的数据,如在某个场景你想删除某个用户,但又要删除这个用户相关的信息,这种操作就构造一个事务。
事务有四个特性
原子性
一个事务的所有操作,要么全部完成,要么都不完成,如果在事务执行过程中发送错误则会回滚到事务开始前的状态。
一致性
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。即写入的数据必须符合所有预设规则。
隔离性
数据库允许多个并发事务同时对其数据库进行读写与修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据库的不一致。事务隔离分为不同级别 ,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
注意:在MySQL中只有使用了InnoDB数据库引擎的数据表才能实现事务
通过transaction
方法实现事务,该方法不需要你手动设置,回滚,事务提交。当事务中发生错误时会自动抛出异常并回滚到事务执行之前的状态
DB::transaction(function(){
...事务执行
})
事务传参
由于事务中使用的是匿名函数,给匿名函数传参需按照下面格式
DB::transaction(function () use ($arguments){
....
})
DB::transaction(function () use ($req){
Pro::where('id',$req->id)->update(['money'=>$req->money]);
DB::table('inves')->insert(['uid'=>Auth::user()->id,'pid'=>$req->id,'money'=>$req->money,'status'=>1,'pubtime'=>time()]);
});
手动操作事务
手动操作事务,控制事务回滚,事务提交
DB::beginTransaction()
:开启事务
DB::rollback()
:事务回滚
DB:commit()
:提交事务
如下简单示例
DB::beginTransaction();
try {
Pro::where('id',$req->id)->update(['money'=>$req->money]);
DB::table('inves')->insert(['uid'=>Auth::user()->id,'pid'=>$req->id,'money'=>$req->money,'status'=>1,'pubtime'=>time()]);
} catch(\Exception $e)
{
DB::rollback();//事务回滚
throw $e;
}
DB::commit();
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有