1. 程式人生 > >TP框架使用資料庫事務

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也能操作事務