标题:
PHP与MYSQL事务处理
[打印本页]
作者:
fangzhen
时间:
2009-8-10 23:42
标题:
PHP与MYSQL事务处理
1
、用
begin,rollback,commit
来实现
begin
开始一个事务
rollback
事务回滚
commit
事务确认
2
、直接用
set
来改变
mysql
的自动提交模式
MYSQL
默认是自动提交的,也就是你提交一个
QUERY
,它就直接执行!我们可以通过
set autocommit=0
禁止自动提交
set autocommit=1
开启自动提交
来实现事务的处理。
当你用
set autocommit=0
的时候,你以后所有的
SQL
都将做为事务处理,直到你用
commit
确认或
rollback
结束。
注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!
MYSQL
中只有
INNODB
和
BDB
类型的数据表才能支持事务处理!其他的类型是不支持的!
***
:
一般
MYSQL
数据库默认的引擎是
MyISAM,
这种引擎不支持事务!如果要让
MYSQL
支持事务,可以自己手动修改
:
方法如下:
1.
修改
c:\appserv\mysql\my.ini
文件,找到
skip-InnoDB,
在前面加上
#
,后保存文件。
2.
在运行中输入:
services.msc,
重启
mysql
服务。
3.
到
phpmyadmin
中,
mysql->show engines;(
或执行
mysql->show variables like 'have_%'; ),
查看
InnoDB
为
YES,
即表示数据库支持
InnoDB
了。
也就说明支持事务
transaction
了。
4.
在创建表时,就可以为
Storage Engine
选择
InnoDB
引擎了。如果是以前创建的表,可以使用
mysql->alter table table_name type=InnoDB;
或
mysql->alter table table_name engine=InnoDB;
来改变数据表的引擎以支持事务。
以下是我做??的示例代?
:
/***************
transaction--1 ***************/
/*
方法一
*/
mysql_query("BEGIN");
//
或者
mysql_query("START TRANSACTION");
//
若不使用事?,?
$sql
?行成功,
$sql1
?行失?
$sql
=
" insert into test values('11','88') ";
$sql1 =
" insert into test values('11','88','444') ";
$res
= mysql_query($sql);
$res1 = mysql_query($sql1);
//
因?使用了事?,???
insert
都?行失?
if($res && $res1){
mysql_query("COMMIT");
}
else{
mysql_query("ROLLBACK");
}
mysql_query("END");
/****************
transaction--2 *******************/
/*
方法二
*/
mysql_query("SET
AUTOCOMMIT=0");
//
?置
mysql
不自?提交,需自行用
commit
?句提交
$sql=" insert into test values('11','88') ";
$sql1 =" insert into test values('11','88','444') ";
$res= mysql_query($sql);
$res1 = mysql_query($sql1);
//
因?使用了事?,???
insert
都?行失?
if($res && $res1){
mysql_query("COMMIT");
}
else{
mysql_query("ROLLBACK");
}
mysql_query("END");
/*************************** END ***************/
对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:
代码如下:
//MyISAM & InnoDB 都支持,
//Notes:query?句不能?在一起如:mysql_query("select * from a;select * from b;");
$sql_1=" LOCK TABLES test WRITE ";
mysql_query($sql_1);
$sql_2=" INSERT INTO test VALUES('".$a."','".$b."') ";
if(mysql_query($sql_2)){
echo 'successful!';
}else{
echo 'Unsuccessful!';
}
$sql_3=" UNLOCK TABLES ";
mysql_query($sql_3);
欢迎光临 PHP开发笔记 (http://phpvi.com/)
Powered by Discuz! 6.1.0