TP框架使用資料庫事務
阿新 • • 發佈:2018-11-26
資料庫事務:比如你去下單購買一件物品,首先扣除了你的錢,商品減少了一件庫存,生成了一條訂單記錄,比如在生成訂單記錄的時候出錯了,那麼之前執行的一系列操作也完成了,會造成資料庫的資料混亂,產生更大的麻煩……
這時,使用資料庫事務來操作整個購買,會使安全性更高……
為了方便大家理解下面的操作,先看一下資料庫資料:
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也能操作事務