数据库事务:比如你去下单购买一件物品,首先扣除了你的钱,商品减少了一件库存,生成了一条订单记录,比如在生成订单记录的时候出错了,那么之前执行的一系列操作也完成了,会造成数据库的数据混乱,产生更大的麻烦……
这时,使用数据库事务来操作整个购买,会使安全性更高……
为了方便大家理解下面的操作,先看一下数据库数据:
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也能操作事务