TP框架使用数据库事务

数据库事务:比如你去下单购买一件物品,首先扣除了你的钱,商品减少了一件库存,生成了一条订单记录,比如在生成订单记录的时候出错了,那么之前执行的一系列操作也完成了,会造成数据库的数据混乱,产生更大的麻烦……

这时,使用数据库事务来操作整个购买,会使安全性更高……

为了方便大家理解下面的操作,先看一下数据库数据:

stu表:

只存了ID为1和ID为3的两条记录。

tp5操作数据库事务:

<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
use think\Db;
class Index extends Controller
{
    public function index()
    {
        Db::startTrans();
        try{
            $sql=Db::table('stu')
            ->where('id',1)
            ->delete();
            if(!$sql)
            {
                Db::rollback();
            }
            $sqls=Db::table('stu')
            ->where('id',2)
            ->delete();
            if(!$sqls)
            {
                Db::rollback();
            }
        }
        catch (\Exception $e) {
            Db::rollback();   // 回滚事务
        }
        Db::commit();        //执行结果
    }
}

代码解析:我要删除stu表里面id为1和id为2的两条记录,大家看上面的数据库,没有id为2的记录,如果没执行这一步,就rollback回去,上面已经执行了删除id为1的那条记录,但是没有id为2的人,就回滚操作,从而id为1的这个人的记录就没删除掉……如果sql语句都执行成功的话,在最后面加上Db::commit,意思是执行sql结果。

tp3操作数据库事务:

	M()->startTrans();
	try 
	{
	        // 扣除余额
	        $decBalance = M('member')->where(array("id"=>$accountInfo))->setDec($ziduan, $transNum);
	        if (!$decBalance) {
	            M()->rollback();
	        }

	        //写记录——奖金转消费钱包
	        $dates = M('bonusrecord')
        	->add(['b_bonus'=>'-'.$transNum,'b_date'=>$time,'u_id'=>$accountInfo,'type'=>'奖金转消费钱包']);
	        if (!$dates) {
	            M()->rollback();
	        }
	} 	
        catch (\Exception $e){
            M()->rollback();
	}

	M()->commit();

我踩过的坑:操作sql语句的时候,别用$sql=db(表名),用$sql=Db::table(表名)

因为调用的都是Db,而不是db,否则事务没效果!!!

不用try和catch也能操作事务

猜你喜欢

转载自blog.csdn.net/qq_42249896/article/details/84531112
今日推荐