原生 PHP、Laravel5.4、Yii2 和 ThinkPHP3.2 中的事务实例

一、原生 MySQL

<?php
// 开启一个事务
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');   
}

二、Laravel5.4

<?php
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('操作失败!');
}

三、Yii2

<?php
// 开启事务
$transaction = Yii::$app->db->beginTransaction();
try {
    // 插入文章
    $res = $this->save();
    $data = [];
    foreach ($category_ids as $val) {
        $data[] = [$this->id, $val];
    }
    // 添加或更改分类文章时,先清空
    CategoryArticle::deleteAll('post_id = :post_id ', [':post_id' => $this->id]);

    // 批量插入分类文章表
    Yii::$app->db->createCommand()->batchInsert('feehi_category_article', ['post_id','category_id'], $data)->execute();
    // 提交
    $transaction->commit();
} catch (\Exception $e) {
    // 回滚
    $transaction->rollback();
    // 抛出异常
    throw $e;
}

四、ThinkPHP3.2

<?php
$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'));
} else {
    // 事务回滚
    $modelRefund->rollback();
    $this->error(C('OPERA_FAILD'));
}

(完)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蓝天

Rsync完全配置

系统环境---Rsync完全配置 rsync version 2.6.3 protocol version 28 Slackware 9.2 配置/etc/...

1093
来自专栏跟着阿笨一起玩NET

GhostDoc(注释生成工具)使用方法

本文转载:http://www.cnblogs.com/scottckt/archive/2011/07/13/2105055.html

3662
来自专栏互扯程序

Linux常用Shell脚本,值得学习及收藏

在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运...

1621
来自专栏菩提树下的杨过

Spring Security笔记:Remember Me(下次自动登录)

前一节学习了如何限制登录尝试次数,今天在这个基础上再增加一点新功能:Remember Me. 很多网站,比如博客园,在登录页面就有这个选项,勾选“下次自动登录”...

4086
来自专栏杂烩

kafka-eagle1.1.9安装 原

源码地址https://github.com/smartloli/kafka-eagle

1031
来自专栏张高兴的博客

张高兴的 UWP 开发笔记:应用内启动应用 (UWP Launch UWP)

3539
来自专栏jojo的技术小屋

原 WampServer的安装和配置

作者:汪娇娇 时间:2017年9月19日 php文件怎么调试?借助外在服务器是必须的,今天我就为大家介绍一个我用的工具:WampServer。 WampServ...

3528
来自专栏智能大石头

XCode中如何使用事务

废话不多说,直接上代码: // try之前开始事务 Meta.BeginTrans(); try{ // do something // 强烈建议,尽可能做到只...

1906
来自专栏腾讯云TStack专栏

Ceph 部署完整版 ( el7+jewel )

这篇文章主要介绍了如何用三台虚拟机搭建一套 Ceph 分布式系统,步骤简洁但不失准确性。环境清理一小节可以解决绝大多数部署不成功的问题,最后一节介绍了常用的 C...

1.1K1
来自专栏jojo的技术小屋

原 WampServer的安装和配置

1963

扫码关注云+社区

领取腾讯云代金券