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:apps教程ervmysqlmy.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。
2.在运行中输入:services.msc,重启mysql服务。
3.到php教程myadmin中,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;来改变数据表的引擎以支持事务。 </p>
SET?FOREIGN_KEY_CHECKS=0;
—?—————————-
—?Table?structure?for?open_article
—?—————————-
CREATE?TABLE?`open_article`?(
`nId`?int(11)?NOT?NULL?auto_increment,
`nOrder`?int(11)?default?‘0′,
`sTopic`?varchar(100)?default?NULL,
`sContent`?varchar(255)?default?NULL,
`dDatetime`?timestamp?NULL?default?CURRENT_TIMESTAMP?on?update?CURRENT_TIMESTAMP,
PRIMARY?KEY?(`nId`)
)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;
<?PHP
header(”Content-Type:text/html;charset=utf-8″);
$host?=?“localhost”;
$user?=?“root”;
$password?=?“mypassword”;
$db?=?“test_store_proc”;
$dblink?=?mysql_connect($host,?$user,?$password)?or?die(”Can’t?connect?to?mysql”);
mysql_select_db($db,?$dblink);
mysql_query(”SET?NAMES?UTF8″);
/*?创建事务?*/?
mysql_query(’START?TRANSACTION’)?or?exit(mysql_error());
//第1条插入语句:
$sql?=?“insert?into?open_article?(nOrder,?sTopic,?sContent)?values?(0,?‘News?Main?Topic-1′,’资讯内容-1′)”;
if(!mysql_query($sql))
{
echo?$sql?.’:<br>’.?mysql_errno()?.?“:”?.?mysql_error()?.?“<br>”;
mysql_query(’ROLLBACK’)?or?exit(’ROLLBACKing:’.?mysql_error());?//判断当执行失败时回滚
exit;
}
//第2条插入语句:
$sql?=?“insert?into?open_article?(nOrder,?sTopic,?sContent)?values?(0,?‘News?Main?Topic-2′,’资讯内容-2′)”;
if(!mysql_query($sql))
{
echo?$sql?.’:<br>’.?mysql_errno()?.?“:”?.?mysql_error()?.?“<br>”;
mysql_query(’ROLLBACK’)?or?exit(’ROLLBACKing:’.?mysql_error());?//判断当执行失败时回滚
exit;
}
mysql_query(’COMMIT’)?or?exit(mysql_error());?//执行事务
mysql_close($dblink);
?>
如果把第2条插入SQL语句改为:
$sql = “insert into open_article (nOrder, sTopic2, sContent) values (0, ‘News Main Topic-2′,’资讯内容-2′)”;
由于sTopic2字段不存在,程序会报错终止。这时会发现没有记录被插入到表中,说明第1条插入SQL语句也没有生效,实际是被事务回滚了。
怎么看出是“被事务回滚了”?因为open_article表的有个自动增量字段 nId。当重新纠正第2条插入SQL语句,再运行程序时,会发现 nId 的值跳了1,说明前次第1条插入SQL语句确实被执行了,然后又被取消