php操作mysqlshiwu/ target=_blank class=infotextkey>mysql事务的方法,分析了acid特征。
php操作mysql事务的方法
事务都应该具备acid特征。所谓acid是atomic(原子性),consistent(一致性),isolated(隔离性),durable(持续性)四个词的首字母所写。
以“银行转帐”来说明其含义:
1、原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
2、一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。
3、隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。
5、持续性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。
在php中,mysqli封装了mysql事务的相关操作。
代码:
复制代码 代码示例:
$sql1 = "update user set scorecount = scorecount +10 where id= '123456'";
$sql2 = "update scoredetail set fscore = 300 where id= '123456'";
$sql3 = "insert into scoredetail id,score) values ('123456',60)";
$mysqli = new mysqli('localhost','root','','db_lib2test');
$mysqli->autocommit(false);//开始事物
$mysqli->query($sql1);
$mysqli->query($sql2);
if(!$mysqli->errno){
$mysqli->commit();
echo 'ok';
}else{
echo 'err';
$mysqli->rollback();
}
使用 php mysql 系列函数执行事务。
复制代码 代码示例:
$sql1 = "update user set scorecount = scorecount +10 where id= '123456'";
$sql2 = "update scoredetail set fscore = 300 where id= '123456'";
$sql3 = "insert into scoredetail id,score) values ('123456',60)";
$conn = mysql_connect('localhost','root','');
mysql_select_db('db_lib2test');
mysql_query('start transaction');
//mysql_query('set autocommit=0');
mysql_query($sql1);
mysql_query($sql2);
if(mysql_errno ()){
mysql_query('rollback');
echo 'err';
}else{
mysql_query('commit');
echo 'ok';
}
// mysql_query('set autocommit=1');
// mysql_query($sql3);
注意:
myisam:不支持事务,用于只读程序提高性能
innodb:支持acid事务、行级锁、并发
berkeley db:支持事务