搜尋
首頁後端開發php教程apache php mysql PHP與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;改變資料表的引擎以支援交易。
*/
/**************** 交易--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
超越炒作:評估當今PHP的角色超越炒作:評估當今PHP的角色Apr 12, 2025 am 12:17 AM

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

PHP中的弱參考是什麼?什麼時候有用?PHP中的弱參考是什麼?什麼時候有用?Apr 12, 2025 am 12:13 AM

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

解釋PHP中的__ Invoke Magic方法。解釋PHP中的__ Invoke Magic方法。Apr 12, 2025 am 12:07 AM

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。

解釋PHP 8.1中的纖維以進行並發。解釋PHP 8.1中的纖維以進行並發。Apr 12, 2025 am 12:05 AM

Fibers在PHP8.1中引入,提升了並發處理能力。 1)Fibers是一種輕量級的並發模型,類似於協程。 2)它們允許開發者手動控制任務的執行流,適合處理I/O密集型任務。 3)使用Fibers可以編寫更高效、響應性更強的代碼。

PHP社區:資源,支持和發展PHP社區:資源,支持和發展Apr 12, 2025 am 12:04 AM

PHP社區提供了豐富的資源和支持,幫助開發者成長。 1)資源包括官方文檔、教程、博客和開源項目如Laravel和Symfony。 2)支持可以通過StackOverflow、Reddit和Slack頻道獲得。 3)開發動態可以通過關注RFC了解。 4)融入社區可以通過積極參與、貢獻代碼和學習分享來實現。

PHP與Python:了解差異PHP與Python:了解差異Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

php:死亡還是簡單地適應?php:死亡還是簡單地適應?Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來:改編和創新PHP的未來:改編和創新Apr 11, 2025 am 12:01 AM

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1

記事本++7.3.1

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

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版