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