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

相關文章
相關標籤/搜索