首頁 後端開發 php教程 apache php mysql PHP與MYSQL事務處理

apache php mysql PHP與MYSQL事務處理

Jul 29, 2016 am 08:33 AM

/*
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;改變資料表的引擎以支援交易。
*/
/**************** 交易--1 ***************/
$conn = mysql_connect('localhost','root','root') or die ("資料連線錯誤!!!");
mysql_select_db('test',$conn);
mysql_query("set names 'GBK'"); //使用GBK中文編碼;
//開始一個交易
mysql_query("BEGIN") ; //或mysql_query("START TRANSACTION");
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')" ;
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//這條我故意寫錯
$res = mysql_query($sql);
$res1 = mysql_query($sql2); 
if($res && $res1){
mysql_query("COMMIT");
echo '提交成功。 ';
}else{
mysql_query("ROLLBACK");
echo '資料回滾。 ';
}
mysql_query("END"); 
/**************** 交易--2 *******************/
/*方法二*/
mysql_query("SET AUTOCOMMIT=0"); / /設定mysql不自動提交,需自行用commit語句提交
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0') ";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//這我故意寫錯
$res = mysql_query($sql);
$res1 = mysql_query($sql2); 
if($res && $res1){
mysql_query("COMMIT");
echo '提交成功。 ';
}else{
mysql_query("ROLLBACK");
echo '資料回滾。 ';
}
mysql_query("END"); //交易處理完時別忘記mysql_query("SET AUTOCOMMIT=1");自動提交
/******************對於不支援交易的MyISAM引擎資料庫可以使用表鎖定的方法:********************/
//MyISAM & InnoDB 都支援,
/*
LOCK TABLES可以鎖定用於目前執行緒的表。如果表被其它線程鎖定,則造成堵塞,直到可以獲得所有鎖定為止。
UNLOCK TABLES可以釋放被目前執行緒保持的任何鎖定。當執行緒發布另一個LOCK TABLES時,或當與伺服器的連線關閉時,所有由目前執行緒鎖定的表被隱含地解鎖。
*/
mysql_query("LOCK TABLES `user` WRITE");//鎖住`user`表
$sql = "INSERT INTO `user` (`id`, `username`, ` sex`) VALUES (NULL, 'test1', '0')";
$res = mysql_query($sql);
if($res){
echo '提交成功。 !';
}else{
echo '失敗!';
}
mysql_query("UNLOCK TABLES");//解除鎖定

MyISAM 是MySQL中預設的儲存引擎,一般來說不是有太多人關心這個東西。決定使用什麼樣的儲存引擎是一個很tricky的事情,但還是值我們去研究一下,這裡的文章只考慮 MyISAM 和InnoDB這兩個,因為這兩個是最常見的。   
以下先讓我們回答一些問題:   
◆你的資料庫有外鍵嗎?   
◆你需要事務支援嗎?   
◆你需要全文索引嗎?   
◆你常使用什麼樣的查詢模式?   
◆你的資料有多大?
myisam只有索引快取   
innodb不分索引檔案資料檔案innodb buffer   
myisam只能管理索引,索引資料大於分配資源時,會被作業系統來cache;資料檔案依賴的作業系統的cache。 innodb不管是索引還是數據,都是自己來管理   
思考上面這些問題可以讓你找到適當的方向,但那並不是絕對的。如果你需要事務處理或外鍵,那麼InnoDB 可能是比較好的方式。如果你需要全文索引,那麼通常來說 MyISAM是好的選擇,因為這是系統內建的,然而,我們其實並不會經常地去測試兩百萬行記錄。所以,就算是慢一點,我們可以透過使用Sphinx從 InnoDB中獲得全文索引。   
資料的大小,是影響你選擇什麼樣儲存引擎的重要因素,大尺寸的資料集傾向於選擇InnoDB方式,因為其支援事務處理和故障復原。資料庫的在小決定了 故障恢復的時間長短,InnoDB可以利用交易日誌進行資料恢復,這會比較快。而MyISAM可能會需要幾個小時甚至幾天來幹這些事,InnoDB只需要 幾分鐘。   
您操作資料庫表的習慣也可能是對效能有很大影響的因素。例如: COUNT() 在 MyISAM 表中會非常快,而在InnoDB 表下可能會很痛苦。而主鍵查詢則在InnoDB下會相當相當的快,但需要小心的是如果我們的主鍵太長了也會導致效能問題。大批的inserts 語句在 MyISAM下會快一些,但是updates 在InnoDB 下會更快一些-尤其在並發量大的時候。   
所以,到底你檢使用哪一個呢?根據經驗來看,如果是一些小型的應用或項目,那麼MyISAM 也許會更適合。當然,在大型的環境下使用 MyISAM 也會有很大成功的時候,但卻不總是這樣的。如果你正在計劃使用一個超大資料量的項目,而且需要事務處理或外鍵支持,那麼你真的應該直接使用 InnoDB方式。但需要記住InnoDB 的表需要更多的內存和存儲,轉換100GB 的MyISAM 表到InnoDB 表可能會讓你有非常壞的體驗。
=============================================== ============   
MyISAM:這個是預設類型,它是基於傳統的ISAM類型,ISAM是Indexed Sequential Access Method (有索引的順序存取方法) 的縮寫,它是存儲記錄和文件的標準方法.與其他儲存引擎比較,MyISAM具有檢查和修復表格的大多數工具. MyISAM表格可以被壓縮,而且它們支援全文搜尋.它們不是事務安全的,而且也不支援外鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執行大量 的SELECT,MyISAM是更好的選擇。
InnoDB:這種類型是事務安全的.它與BDB類型具有相同的特性,它們還支持外鍵.InnoDB表格速度很快.具有比BDB還豐富的特性,因此如果需要一個事務安全的存儲引擎,建議使用它.如果你的資料執行大量的INSERT或UPDATE,出於效能方面的考慮,應該使用InnoDB表,   
對於支援事物的InnoDB類型的標,影響速度的主要原因是AUTOCOMMIT預設設定是開啟的,而且程式沒有明確地呼叫BEGIN 開始事務,導致每插入一條都自動Commit,嚴重影響了速度。可以在執行sql前呼叫begin,多條sql形成一個事物(即使autocommit打 開也可以),將大大提高效能。
=============================================== ================   
InnoDB和MyISAM是在使用MySQL最常用的兩個表格類型,各有優缺點,視具體應用而定。以下是已知的兩者之間的差別,僅供參考。   
innodb   
InnoDB 給 MySQL 提供了具有事務(commit)、回滾(rollback)和崩潰修復能力 (crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。 InnoDB 提供了行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non- locking read in SELECTs)。這些特性均提高了多用戶並發操作的效能表現。在InnoDB表中不需要擴大鎖定 (lock escalation),因為 InnoDB 的列鎖定(row level locks)適合非常小的空間。 InnoDB 是 MySQL 上第一個提供外鍵約束(FOREIGN KEY constraints)的表引擎。   
InnoDB 的設計目標是處理大容量資料庫系統,它的 CPU 使用率是其它基於磁碟的關聯式資料庫引擎所不能比的。在技​​術上,InnoDB 是一套放在 MySQL 後台的完整資料庫系統,InnoDB 在主記憶體中建立其專用的緩衝池用於高速緩衝資料和索引。 InnoDB 把資料和索引存放在表空間裡,可能包含多個文件,這與其它的不一樣,舉例來說,在 MyISAM 中,表被存放在單獨的文件中。 InnoDB 表的大小只受限於作業系統的檔案大小,一般為 2 GB。
InnoDB所有的表都保存在同一個資料檔ibdata1 中(也可能是多個文件,或是獨立的表空間文件),相對來說比較不好備份,免費的方案可以是拷貝資料檔、備份binlog,或用mysqldump。   
MyISAM   
MyISAM 是MySQL缺省存貯引擎 .   
每張MyISAM 表存放在三個文件 。 frm 檔案存放表格定義。 資料檔是MYD (MYData) 。 索引檔是 MYI (MYIndex) 引伸。
因為MyISAM相對簡單所以在效率上要優於InnoDB..小型應用使用MyISAM是不錯的選擇.   
MyISAM表是保存成文件的形式,在跨平台的數據轉移中使用MyISAM存儲會省去不少的麻煩   
以下是一些細節和具體實現的差異:   
1.InnoDB不支援FULLTEXT類型的索引。
2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含 where條件時,兩種表的運算是一樣的。   
3.對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引。   
4.DELETE FROM table時,InnoDB不會重新建立表格,而是一行一行的刪除。
5.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是先把InnoDB表改成MyISAM表,導入資料後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。
另外,InnoDB表的行鎖定也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖定全表,例如update table set num=1 where name like “% aaa%”   
任何一種表都不是萬能的,只用恰當的針對業務類型來選擇合適的表類型,才能最大的發揮MySQL的性能優勢。
=============================================== ================   
以下是InnoDB和MyISAM的一些聯繫和區別!   
1. 4.0以上mysqld都支援事務,包括非max版本。 3.23的需要max版本mysqld才能支援事務。   
2. 建立表格時如果不指定type則預設為myisam,不支援事務。   
可以用 show create table tablename 指令看表格的類型。
2.1 對不支援事務的表做start/commit操作沒有任何效果,在執行commit前已經提交,測試:   
執行一個msyql:   
use test;   
drop table if
create table tn (a varchar(10)) type=myisam;   
drop table if exists ty;   
create table ty (a varchar(10)) 10%)  >insert into tn values('a');   
insert into ty values('a');   
select * from tn;   
select * from ty; 🎜>再執行另一個mysql:   
use test;   
select * from tn;   
select * from ty;   
只有tn可以看到一筆記錄卷;   
才都能看到記錄。   
3. 可以執行以下指令來切換非事務表到事務(資料不會遺失),innodb表比myisam表更安全:   
   alter table tablename type=innodb;   
3.1 innodbdb資料表不能用repairdb指令表不能用repairdb指令表不能用repairdb指令表不能用repairdb指令表不能用repairdb指令myisamchk -r table_name   
但可以用check table,以及mysqlcheck [OPTIONS] database [tables]   
============================= =====================================   
mysql中使用select for update的必須針對InnoDb ,並且是在一個事務中,才能起作用。   
select的條件不一樣,採用的是行級鎖定還是表級鎖定也不一樣。
轉http://www.neo.com.tw/archives/900 的說明   
由於InnoDB 預設是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL 才會執行Row lock (只鎖住被選取的資料例) ,否則MySQL 將會執行Table Lock (將整個資料表單給鎖住)。   
舉例:   
假設有個表單products ,裡面有id 跟name 二欄位,id 是主鍵。
例1: (明確指定主鍵,且有此筆資料,row lock)   
SELECT * FROM products WHERE id='3′ FOR UPDATE;   
例2: (明確指定主鍵,若無查此筆資料,無lock)   
SELECT * FROM products WHERE id='-1′ FOR UPDATE;   
例2: (無主鍵,table lock)   
SELECT * FROM products FOR UPDATE;   
例3: (主鍵不明確,table lock)   
SELECT * FROM products WHERE id'3′ FOR UPDATE   >SELECT * FROM products WHERE id LIKE '3′ FOR UPDATE;   
註1:   
FOR UPDATE 只適用於InnoDB,且必須在交易區塊(BEGIN/COMMIT)中才能生效

以上就介紹了apache php mysql PHP與MYSQL事務處理,包含了apache php mysql的內容,希望對PHP教學有興趣的朋友有幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

See all articles