账户中心 退出系统
开发文档 资讯·分享 技术交流 会员登录
phpGrace GSCMS 公众号系统
事务处理

事务概述

事务(transaction)是由查询和/或更新语句的序列组成。 用 begin、start transaction 开始一个事务,rollback 回滚事务,commit 提交事务。
在开始一个事务后,可以有若干个 SQL 查询或更新语句,每个SQL执行后,还应该有判断是否正确执行的语句,以确定下一步是否回滚,若都被正确执行则最后提交事务。
事务一旦回滚,数据库则保持开始事务前状态。就好象一个被编辑的文件不存盘退出,自然还是保持文件原来的样子。所以,事务可被视为原子操作,事务中的 SQL,要么全部执行,要不一句都不执行。

注意事项

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

使用方法

1、开启事务 $table->beginTransaction();
2、根据结果决定回滚 $table->rollback(); 或者提交 $table->commit();

演示数据表

CREATE TABLE `grace_accounts` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `balance` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of accounts
-- ----------------------------
INSERT INTO `accounts` VALUES ('1', '张三', '1000');
INSERT INTO `accounts` VALUES ('2', '李四', '0');

事务演示

<?php
namespace grace\controller;
use grace\grace;
use grace\database;

class index extends grace{
    public function index(){
        //演示: 从张三账户转账给李四200元
        $table = database::table('accounts');
        //开启事务
        $table->beginTransaction();
        //扣除张三 200 元
        $table->where('id = ?', array(1))->field('balance', -200);
        //给李四账户充值 200元
        $res = $table->where('id = ?', array(2))->field('balance', 200);
        $rowCount = $table->rowCount();
        //如果给李四账户充值 200元不成功则回滚
        if(!$res || $rowCount < 1){
            echo '回滚...';
            $table->rollback();
        }else{
            //成功则进行提交
            echo '操作成功';
            $table->commit();
        }
    }
}