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:\appserv\mysql\my.ini文件,找到skip-InnoDB,在後面加上#,後保留文件。
2.在運轉中輸出:services.msc,重啟mysql辦事。
3.到phpmyadmin中,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;來轉變數據表的引擎以支撐事務。
以下是測試的實例代碼
mysql_query("BEGIN"); //或許mysql_query("START TRANSACTION");
//若不應用事務,則$sql履行勝利,$sql1履行掉敗
$sql = " insert into test values('11','88') ";
$sql1 = " insert into test values('11','88','444') ";
$res = mysql_query($sql);
$res1 = mysql_query($sql1);
//由於應用了事務,則兩個insert都履行掉敗
if($res && $res1){
mysql_query("COMMIT");
}
else{
mysql_query("ROLLBACK");
}
mysql_query("END");
mysql_query("SET AUTOCOMMIT=0"); //設置mysql不自動提交,需自行用commit語句提交
$sql = " insert into test values('11','88') ";
$sql1 = " insert into test values('11','88','444') ";
$res = mysql_query($sql);
$res1 = mysql_query($sql1);
//由於應用了事物,則兩個insert都履行掉敗
if($res && $res1){
mysql_query("COMMIT");
}
else{
mysql_query("ROLLBACK");
}
mysql_query("END");
關於不支撐事務的MyISAM引擎數據庫可使用表鎖定的辦法:
代碼以下:
//MyISAM & InnoDB 都支撐,
//Notes:query語句不克不及寫在一路如:mysql_query("select * from a;select * from b;");
$sql_1=" LOCK TABLES test WRITE ";
mysql_query($sql_1);
$sql_2=" INSERT INTO test VALUES('".$a."','".$b."') ";
if(mysql_query($sql_2)){
echo 'successful!';
}else{
echo 'Unsuccessful!';
}
$sql_3=" UNLOCK TABLES ";
mysql_query($sql_3);