事物处理用例
事务能确保工作单元内的所有操作都成功完成,否则事务将被中止,在故障点及以前的操作将回滚到以前的状态。
MySQL的事务处理功能在MYSIAM存储引擎中是不支持的,在InnoDB存储引擎中是支持的。
所以:确保涉及的数据表存储引擎是InnoDB。
列举两例:
(一)后台审核申请表
框架:ThinkPHP
1.业务逻辑
在后台审核申请表时,要填写审核意见,勾选状态。
这里涉及到四张表。
apply,
market,
process,
process_remark
查看这四张表的存储引擎是InnoDB。
审核后,
更新apply中的审核状态status(通过,拒绝,修改)
process表中, 添加一条记录
process_remark表中, 添加一条记录
如果审核通过,market表中添加一条记录。拒绝和修改时,则不添加。
2. 主要代码
$adata = M(MODULE_NAME); // 或写为M('C_product_apply')
$adata->startTrans(); // 事务开始
…
$aid =$adata->save($data); // 有更新才保存
…
if ($data['status'] == 1) {
$market = M('C_product_market');
…
$mid =$market->add($mdata);
}else{
$mid =1; // 如果 状态值为 2,3 时
}
…
$process =M('C_product_process');
…
$pid = $process->add($pdata);
$remark =M('C_product_process_remark');
…
$rid = $remark->add($rdata);
if ($aid && $mid && $pid && $rid) {
$adata->commit(); //成功,则提交
} else {
$adata->rollback(); //不成功,则回滚
}
(二):
框架:不是ThinkPHP
1. 业务逻辑:
查询product_market表中market_at为当天的,按规则往另三张表插入记录。
这里涉及到四张表
product_market
sele_buy
market_online
user_stock_balance
查看这四张表的存储引擎是InnoDB。
2.主要代码
$GLOBALS['db']->query("STARTTRANSACTION"); // 事务开始
…
$GLOBALS['db']->autoExecute(DB_PREFIX."c_sell_buy",$sdata,"INSERT");
$sid = $GLOBALS['db']->insert_id();
…
$oid=$GLOBALS['db']->autoExecute(DB_PREFIX."c_product_market_online",$odata,"INSERT");
…
$bid =$GLOBALS['db']->autoExecute(DB_PREFIX."c_user_stock_balance",$bdata,"INSERT");
…
if ( $sid && $oid && $bid ){
$GLOBALS['db']->query("COMMIT"); // 成功,则执行
}else {
$GLOBALS['db']->query('ROLLBACK'); //不成功,则返回
}
http://www.cnblogs.com/ymy124/p/3718439.html