一般来说,事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字母所写,下面以“银行转帐”为例来分别说明一下它们的含义:
① 原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
② 一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。
③ 隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。
④ 持续性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。
在PHP中,mysqli 已经很好的封装了mysql事务的相关操作。如下示例:
注意:表类型必须为InnoDB类型 代码:
<?php
header('content-type:text/html;charset=utf8');
$mysqli = new mysqli('localhost','root','root','test');
//开始事务
$mysqli->autocommit(false);
$sql1='insert into user (name,age,class) values("test1",22,3)';//正常的
$sql2='insert into user (names,age,class) values("test2",33,4)';//故意写错的
$mysqli->query($sql1);
$mysqli->query($sql2);
if(!$mysqli->error){
$mysqli->commit();//事务提交
echo '提交数据';
}else{
echo '数据回滚';
$mysqli->rollback();//事务回滚
}
使用 php mysql 系列函数执行事务:
<?php
header('content-type:text/html;charset=utf8');
//连接数据库
$mysql=@mysql_connect('localhost','root','root');
mysql_select_db('test');
mysql_query("set names utf8");
//开启事务
mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");
$sql1='insert into user (name,age,class) values("test1",22,3)';//正常的
$sql2='insert into user (names,age,class) values("test2",33,4)';//故意写错的
$res1=mysql_query($sql1);
$res2=mysql_query($sql2);
if($res1 && $res2){
mysql_query("COMMIT");
echo '提交成功。';
}else{
mysql_query("ROLLBACK");
echo '数据回滚。';
}
mysql_query("END");