首先这个功能很简单就是申请提现,还没做到支付,只是直接双方数据一致而已;
为什么要使用事务?
在生活中肯定使用过支付宝提现,基本原理应该就是,当你申请提现后,对方数据库扣除相应金额,然后我们会有一天提现记录。所以这个过程两者都必须成功,否则出现的情况就是对方以扣费,而你这边却没有生成记录,只有一方操作成功了。
那么事务的原理就是:当事务开始后之后的操作倘若有一个不成功就可以回到事务开始之前的样子···············(讲的比较糙)
放代码吧:
/**
*提现处理 为保证双方数据操作一致使用事务处理
*@access public
*@return json {code:0失败 1成功,msg:提示信息}
*/
public function takeMoney(){
$model=new \Think\Model();
$pingtai_comlist = M('pingtai_comlist');
$pingtai_tixian = M('pingtai_tixian');
$where['cid'] = $this->cid;
$where['ptid'] = I('post.ptid');
$where['price'] = I('post.price');
$where['time'] = time();
$where['order_id'] = $this->getOrderId();
$blance = $pingtai_comlist
->field('id,price')
->where(array('cid'=>$this->cid,'ptid'=>$where['ptid']))
->find();
if($where['price'] >= $blance['price'] || $blance['price'] < 0){
$res = array('code'=>0,'msg'=>'余额不足');
}else{
//提现事务
$allAdded = true; //先设定一个值为 true;
$model->startTrans(); //开启事物
//账户扣除
$do1 = $pingtai_comlist
->where(array('id'=>$blance['id'],'cid'=>$this->cid))
->save(array('price'=>($blance['price']-$where['price'])));
//提现记录生成
$do2 = $pingtai_tixian
->add($where);
//是否执行成功
if($do1 && $do2){
//提交
$model->commit();
$res = array('code'=>1,'msg'=>'处理中······');
}else{
//回滚
$model->rollback();
}
}
echo json_encode($res);
}