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:appservmysqlmy.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);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2558/viewspace-2810332/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql事務處理與鎖機制MySql
- MySQL事務處理MySql
- MySQL的事務處理及隔離級別MySql
- MySQL原理簡介—8.MySQL併發事務處理MySql
- 深入理解Mysql——鎖、事務與併發控制MySql
- 深入理解 MySQL—鎖、事務與併發控制MySql
- MySQL – 事務的啟動 / 設定 / 鎖 / 解鎖——入門MySql
- MySQL事務與鎖MySql
- MySQL 事務和鎖MySql
- MySQL事務和鎖MySql
- MySQL事務原理淺析MySql
- 十五:MySQL層事務提交流程簡析(筆記)MySql筆記
- 第15節:MySQL層事務提交流程簡析MySql
- nodejs 連線 mysql 查詢事務處理NodeJSMySql
- 分散式事務處理方案,微服事務處理方案分散式
- Spring事務專題(三)事務的基本概念,Mysql事務處理原理SpringMySql
- MySQL 筆記 - 事務&鎖MySql筆記
- mysql之鎖與事務MySql
- MySql(四) InnoDB事務淺析MySql
- Mysql如何處理死鎖MySql
- MySQL中不得不提的事務處理MySql
- mysqli 事務處理MySql
- springboot事務處理Spring Boot
- T-SQL:事務鎖下的併發處理(十五)SQL
- MySQL入門--事務與鎖MySql
- mysql鎖與事務總結MySql
- etcd分散式鎖及事務分散式
- 深入理解Redis事務、事務異常、樂觀鎖、管道Redis
- 一次ORACLE分散式事務鎖異常處理分析Oracle分散式
- TransactionScope事務處理方法介紹及.NETCore中的注意事項NetCore
- MySQL(一):MySQL資料庫事務與鎖MySql資料庫
- mysql 事務,鎖,隔離機制MySql
- MySQL的表碎片處理MySql
- 設定mysql 事務鎖超時時間 innodb_lock_wait_timeoutMySqlAI
- Laravel 分散式事務處理Laravel分散式
- 事務處理基本概念
- 深入理解Mysql事務隔離級別與鎖機制問題RLOGMySql
- 淺析MySQL事務中的redo與undoMySql