mysql事务处理

mysql中的事务处理在web开发中经常会遇到,特别是订单支付这里愈加如此。

事务是一般来说必须满足4个特性ACID Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

  • 1、事务的原子性:一组事务,要么成功;要么撤回。

  • 2、稳定性 : 有非法数据(外键约束之类),事务撤回。

  • 3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。

  • 4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。

    在转账的时候,或者比如在人员管理系统中,你删除一个人的信息,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

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

  • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行

  • 事务用来管理insert,update,delete语句

 先来一个最简单的例子看下

/**
 * mysqli 事务处理
 */
$mysqli = new mysqli('localhost','root','1','test');
$mysqli->autocommit(0);//关闭自动提交
$error=true;
$price=1500;
$sql = "update money set rest=rest-{$price} where id=1";
$res = $mysqli->query($sql);
if(!$res){
    $error=false;
    echo "扣款失败";
}else{
    if($mysqli->affected_rows== 0 ){
        echo "Kok得钱没变化";
        $error=false;
    }else{
        echo "kok账户扣款成功";
    }
}

$sql = "update money set rest=rest+{$price} where id=2";
$res = $mysqli->query($sql);
if(!$res){
    $error=false;
    echo "cgy加钱失败";
}else{
    if($mysqli->affected_rows== 0 ){
        echo "cgy钱没变化";
        $error=false;
    }else{
        echo "cgy收到货款";
    }
}

if($error){
    echo "付款成功";
    $mysqli->commit();
}else{
    echo "<br/>事物转账失败";
    $mysqli->rollback();
}
$mysqli->autocommit(1);//事务结束后开启自动提交
$mysqli->close();
//下面给出money表的创建语句
/**
CREATE TABLE `money` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `rest` double NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 
*/

插入2条记录

2016-09-10 22-48-15屏幕截图.png

tip 需要表引擎为InnoDB 才能支持事务

再有不懂的可以发邮件问我,a3831524@126.com

nickname
content