MySQL的事务处理

      事务处理在各类管理系统中都有着普遍的应用,好比人员管理系统,不少同步数据库操做大都须要用到事务处理。好比说,在人员管理系统中,你删除一我的员,你即须要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操做语句就构成一个事务!
      删除的SQL语句
      delete from userinfo where ~~~
      delete from mail where ~~
      delete from article where~~
      ~~
      若是没有事务处理,在你删除的过程当中,假设出错了,只执行了第一句,那么其后果是不可思议的!
      但用事务处理。若是删除出错,你只要rollback就能够取消删除操做(实际上是只要你没有commit你就没有确实的执行该删除操做)
      通常来讲,在商务级的应用中,都必须考虑事务处理的!

      查看inodb信息
      shell> /usr/local/mysql -u root -p
      mysql> show variables like "have_%"
      系统会提示:
      +------------------+-------+
      | Variable_name     | Value |
      +------------------+-------+
      | have_bdb             | YES    |
      | have_crypt            | YES    |
      | have_innodb         | YES    |
      | have_isam            | YES    |
      | have_raid             | YES    |
      | have_symlink        | YES    |
      | have_openssl        | NO     |
      | have_query_cache | YES    |
      +------------------+-------+
      8 rows in set (0.05 sec)
      若是是这样的,那么咱们就能够建立一张支持事务处理的表来试试了。

      MYSQL的事务处理功能!
      一直以来我都觉得MYSQL不支持事务处理,因此在处理多个数据表的数据时,一直都很麻烦(我是不得不将其写入文本文件,在系统从新加载得时候才写入数据库以防出错)~今天发现MYSQL数据库从4.1就开始支持事务功能,听说5.0将引入存储过程^_^
      先简单介绍一下事务吧!事务是DBMS得执行单位。它由有限得数据库操做序列组成得。但不是任意得数据库操做序列都能成为事务。通常来讲,事务是必须知足4个条件(ACID)
      原子性(Autmic):事务在执行性,要作到“要么不作,要么全作!”,就是说不容许事务部分得执行。即便由于故障而使事务不能完成,在rollback时也要消除对数据库得影响!
      一致性(Consistency):事务得操做应该使使数据库从一个一致状态转变倒另外一个一致得状态!就拿网上购物来讲吧,你只有即让商品出库,又让商品进入顾客得购物篮才能构成事务!
      隔离性(Isolation:若是多个事务并发执行,应象各个事务独立执行同样!
      持久性(Durability):一个成功执行得事务对数据库得做用是持久得,即便数据库应故障出错,也应该可以恢复!
  
       MYSQL的事务处理主要有两种方法。
       一、用begin,rollback,commit来实现
              begin 开始一个事务
              rollback 事务回滚
              commit  事务确认
       二、直接用set来改变mysql的自动提交模式
       MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!咱们能够经过
              set autocommit=0   禁止自动提交
              set autocommit=1   开启自动提交
       来实现事务的处理。
       但注意当你用 set autocommit=0 的时候,你之后全部的SQL都将作为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的做为一个事务!
      我的推荐使用第一种方法!
      MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其余的类型是不支持的!(切记!)
      下次有空说下MYSQL的数据表的锁定和解锁!

       MYSQL5.0 WINXP下测试经过~   ^_^
       mysql> use test;
       Database changed
       mysql> CREATE TABLE `dbtest`(
              -> id int(4)
              -> ) TYPE=INNODB;
       Query OK, 0 rows affected, 1 warning (0.05 sec)

       mysql> select * from dbtest
              -> ;
       Empty set (0.01 sec)

       mysql> begin;
       Query OK, 0 rows affected (0.00 sec)

       mysql> insert into dbtest value(5);
       Query OK, 1 row affected (0.00 sec)

       mysql> insert into dbtest value(6);
       Query OK, 1 row affected (0.00 sec)

       mysql> commit;
       Query OK, 0 rows affected (0.00 sec)

       mysql> select * from dbtest;
       +------+
       | id    |
       +------+
       |     5 |
       |     6 |
       +------+
       2 rows in set (0.00 sec)

       mysql> begin;
       Query OK, 0 rows affected (0.00 sec)

       mysql> insert into dbtest values(7);
       Query OK, 1 row affected (0.00 sec)

       mysql> rollback;
       Query OK, 0 rows affected (0.00 sec)

       mysql> select * from dbtest;
       +------+
       | id    |
       +------+
       |     5 |
       |     6 |
       +------+
       2 rows in set (0.00 sec)

       mysql>

       ************************************************

       [PHP]
       function Tran( $sql ) {
              $judge = 1;
              mysql_query('begin');
              foreach ($sql as $v) {
                     if ( !mysql_query($v) ) {
                            $judge = 0;
                    }
              }
              if ($judge == 0) {
                     mysql_query('rollback');
                     return false;
              }
              elseif ($judge == 1) {
                     mysql_query('commit');
                     return true;
              }
       }
       [/PHP]

       ************************************************

       <?php
       $handler=mysql_connect("localhost","root","");
       mysql_select_db("task");
       mysql_query("SET AUTOCOMMIT=0");//设置为不自动提交,由于MYSQL默认当即执行
       mysql_query("BEGIN");//开始事务定义
       if(!mysql_query("insert into trans (id) values('2')"))
       {
              mysql_query("ROOLBACK");//判断当执行失败时回滚
       }
       if(!mysql_query("insert into trans (id) values('4')"))
       {
              mysql_query("ROOLBACK");//判断执行失败回滚
       }
       mysql_query("COMMIT");//执行事务
       mysql_close($handler);
       ?> php

相关文章
相关标签/搜索