转载请务必保留超链接 :原文链接
前言
为什么写这篇blog?
1:自己对MySQL事务做一次复盘
2:分享给各位同行,在项目如何使用MySQL事务
一:MySQL数据库的事务是什么?
MySQL数据库的事务(Transaction)是一组SQL组成的执行单元, 是数据库并发控制和恢复回滚的基本单位。接地气的描述:可以理解为单个表或者多个表的write操作同时成功或者同时失败。
二:怎么用?
分别在原生PHP、Laravel5.4和ThinkPHP3.2中使用MySQL数据库事务的例子:
1:原生MySQL的例子:A用户给B用户转账
mysql_query('START TRANSACTION'); //开启一个事务
$res1 = mysql_query(update table set money=money-1 where id =)
$res2 = mysql_query(update table set money=money+1 where id =)
if($res1 && $res2){
//成功之后提交
mysql_query('COMMIT');
}else{
//失败之后回滚
mysql_query('ROLLBACK');
}
2:在Laravel5.4中使用MySQL数据库事务
Laravel5.4关于事务操作的网址:http://laravelacademy.org/post/6947.html
//业务逻辑:两个表的insert操作
DB::beginTransaction();
try{
//业务处理和事务提交
$data['name'] = 'test_name';
$data['age'] = 25;
$getGroupId = DB::table('db_name.table_name1')->insertGetId($data);
foreach($list_data as $v) {
DB::table('db_name.table_name2')->insert([
'group_id' => $getGroupId,
'name' => $v['name']
]);
}
//成功之后提交
DB::commit();
} catch (\Exception $exception) {
//接收异常处理并回滚和抛出异常
DB::rollBack();
throw new \Exception('操作失败!');
}
3:在ThinkPHP3.2使用MySQL数据库事务
//业务逻辑:两个表的update操作
$modelRefund = D('Home/OrderRefund');
$modelDetail = D('Home/OrderDetail');
//启动事务
$modelRefund->startTrans();
$refund_status = 1;
$updateRefundRes = $modelRefund->saveRefundStatus($where,$refund_status);
$status=6;
foreach($order_detail as $k => $v){
$where['id'] = $v;
$updateDetailRes = $modelDetail->saveDetailCompleteStatus($where,$status);
}
if($updateRefundRes && $updateDetailRes){
//事务提交
$modelRefund->commit();
$this->success(C('OPERA_SUCCESS'));exit;
}else{
//事务回滚
$modelRefund->rollback();
$this->error(C('OPERA_FAILD'));exit;
}
三:有什么作用
避免数据丢失,可以保证数据一致性;
总结:MySQL数据库事务,数据表引擎必须是支持事务的引擎,比如InnoDB、TokuDB、MyRocks;一个事务可以包含多个SQL,该SQL的执行状态要么都成功,要么都失败。
网友评论