设为首页 加入收藏

TOP

MYSQL的事务处理主要有两种方法:
2011-06-12 21:32:38 来源: 作者: 【 】 浏览:64次 评论:0

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语句确实被执行了,然后又被取消

您看到此篇文章时的感受是:
Tags: 责任编辑:administrator
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到QQ空间
分享到: 
上一篇sql的left join 实例与语法用法 下一篇LAST_INSERT_ID mysql_insert_id..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

相关栏目

最新文章

图片主题

热门文章

推荐文章

相关文章

广告位