萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MYSQL的事務處理主要有兩種方法:

MYSQL的事務處理主要有兩種方法:

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語句確實被執行了,然後又被取消

copyright © 萬盛學電腦網 all rights reserved