国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

PHP與MYSQL事務(wù)處理,PHPMYSQL事務(wù)處理

php中文網(wǎng)
發(fā)布: 2016-07-06 14:25:32
原創(chuàng)
1053人瀏覽過

php與mysql事務(wù)處理,phpmysql事務(wù)處理

/*
mysql的事務(wù)處理主要有兩種方法。
1、用begin,rollback,commit來實(shí)現(xiàn)
begin 開始一個(gè)事務(wù)
rollback 事務(wù)回滾
commit 事務(wù)確認(rèn)
2、直接用set來改變mysql的自動(dòng)提交模式
mysql默認(rèn)是自動(dòng)提交的,也就是你提交一個(gè)query,它就直接執(zhí)行!我們可以通過
set autocommit=0 禁止自動(dòng)提交
set autocommit=1 開啟自動(dòng)提交
來實(shí)現(xiàn)事務(wù)的處理。
當(dāng)你用 set autocommit=0 的時(shí)候,你以后所有的sql都將做為事務(wù)處理,直到你用commit確認(rèn)或rollback結(jié)束。
注意當(dāng)你結(jié)束這個(gè)事務(wù)的同時(shí)也開啟了個(gè)新的事務(wù)!按第一種方法只將當(dāng)前的作為一個(gè)事務(wù)!
個(gè)人推薦使用第一種方法!
mysql中只有innodb和bdb類型的數(shù)據(jù)表才能支持事務(wù)處理!其他的類型是不支持的!
***:一般mysql數(shù)據(jù)庫默認(rèn)的引擎是myisam,這種引擎不支持事務(wù)!如果要讓mysql支持事務(wù),可以自己手動(dòng)修改:
方法如下:1.修改c:\appserv\mysql\my.ini文件,找到skip-innodb,在前面加上#,后保存文件。
2.在運(yùn)行中輸入:services.msc,重啟mysql服務(wù)。
3.到phpmyadmin中,mysql->show engines;(或執(zhí)行mysql->show variables like 'have_%'; ),查看innodb為yes,即表示數(shù)據(jù)庫支持innodb了。
也就說明支持事務(wù)transaction了。
4.在創(chuàng)建表時(shí),就可以為storage engine選擇innodb引擎了。如果是以前創(chuàng)建的表,可以使用mysql->alter table table_name type=innodb;
或 mysql->alter table table_name engine=innodb;來改變數(shù)據(jù)表的引擎以支持事務(wù)。
*/
/*************** transaction--1 ***************/
$conn = mysql_connect('localhost','root','root') or die ("數(shù)據(jù)連接錯(cuò)誤!!!");
mysql_select_db('test',$conn);
mysql_query("set names 'gbk'"); //使用gbk中文編碼;
//開始一個(gè)事務(wù)
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')";//這條我故意寫錯(cuò)
$res = mysql_query($sql);
$res1 = mysql_query($sql2);?
if($res && $res1){
mysql_query("commit");
echo '提交成功。';
}else{
mysql_query("rollback");
echo '數(shù)據(jù)回滾。';
}
mysql_query("end");?
/**************** transaction--2 *******************/
/*方法二*/
mysql_query("set autocommit=0"); //設(shè)置mysql不自動(dòng)提交,需自行用commit語句提交
$sql = "insert into `user` (`id`, `username`, `sex`) values (null, 'test1', '0')";
$sql2 = "insert into `user` (`did`, `username`, `sex`) values (null, 'test1', '0')";//這條我故意寫錯(cuò)
$res = mysql_query($sql);
$res1 = mysql_query($sql2);?
if($res && $res1){
mysql_query("commit");
echo '提交成功。';
}else{
mysql_query("rollback");
echo '數(shù)據(jù)回滾。';
}
mysql_query("end"); //事務(wù)處理完時(shí)別忘記mysql_query("set autocommit=1");自動(dòng)提交


/******************對(duì)于不支持事務(wù)的myisam引擎數(shù)據(jù)庫可以使用表鎖定的方法:********************/


//myisam & innodb 都支持,
/*
lock tables可以鎖定用于當(dāng)前線程的表。如果表被其它線程鎖定,則造成堵塞,直到可以獲取所有鎖定為止。
unlock tables可以釋放被當(dāng)前線程保持的任何鎖定。當(dāng)線程發(fā)布另一個(gè)lock tables時(shí),或當(dāng)與服務(wù)器的連接被關(guān)閉時(shí),所有由當(dāng)前線程鎖定的表被隱含地解鎖。
*/

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中默認(rèn)的存儲(chǔ)引擎,一般來說不是有太多人關(guān)心這個(gè)東西。決定使用什么樣的存儲(chǔ)引擎是一個(gè)很tricky的事情,但是還是值我們?nèi)パ芯恳幌拢@里的文章只考慮 MyISAM 和InnoDB這兩個(gè),因?yàn)檫@兩個(gè)是最常見的。???

下面先讓我們回答一些問題:???
◆你的數(shù)據(jù)庫有外鍵嗎????
◆你需要事務(wù)支持嗎????
◆你需要全文索引嗎????
◆你經(jīng)常使用什么樣的查詢模式????
◆你的數(shù)據(jù)有多大????

myisam只有索引緩存???

innodb不分索引文件數(shù)據(jù)文件 innodb buffer???

myisam只能管理索引,在索引數(shù)據(jù)大于分配的資源時(shí),會(huì)由操作系統(tǒng)來cache;數(shù)據(jù)文件依賴于操作系統(tǒng)的cache。innodb不管是索引還是數(shù)據(jù),都是自己來管理???

思考上面這些問題可以讓你找到合適的方向,但那并不是絕對(duì)的。如果你需要事務(wù)處理或是外鍵,那么InnoDB 可能是比較好的方式。如果你需要全文索引,那么通常來說 MyISAM是好的選擇,因?yàn)檫@是系統(tǒng)內(nèi)建的,然而,我們其實(shí)并不會(huì)經(jīng)常地去測(cè)試兩百萬行記錄。所以,就算是慢一點(diǎn),我們可以通過使用Sphinx從 InnoDB中獲得全文索引。???

數(shù)據(jù)的大小,是一個(gè)影響你選擇什么樣存儲(chǔ)引擎的重要因素,大尺寸的數(shù)據(jù)集趨向于選擇InnoDB方式,因?yàn)槠渲С质聞?wù)處理和故障恢復(fù)。數(shù)據(jù)庫的在小決定了 故障恢復(fù)的時(shí)間長(zhǎng)短,InnoDB可以利用事務(wù)日志進(jìn)行數(shù)據(jù)恢復(fù),這會(huì)比較快。而MyISAM可能會(huì)需要幾個(gè)小時(shí)甚至幾天來干這些事,InnoDB只需要 幾分鐘。???

您操作數(shù)據(jù)庫表的習(xí)慣可能也會(huì)是一個(gè)對(duì)性能影響很大的因素。比如: COUNT() 在 MyISAM 表中會(huì)非常快,而在InnoDB 表下可能會(huì)很痛苦。而主鍵查詢則在InnoDB下會(huì)相當(dāng)相當(dāng)?shù)目?,但需要小心的是如果我們的主鍵太長(zhǎng)了也會(huì)導(dǎo)致性能問題。大批的inserts 語句在 MyISAM下會(huì)快一些,但是updates 在InnoDB 下會(huì)更快一些——尤其在并發(fā)量大的時(shí)候。???

所以,到底你檢使用哪一個(gè)呢?根據(jù)經(jīng)驗(yàn)來看,如果是一些小型的應(yīng)用或項(xiàng)目,那么MyISAM 也許會(huì)更適合。當(dāng)然,在大型的環(huán)境下使用 MyISAM 也會(huì)有很大成功的時(shí)候,但卻不總是這樣的。如果你正在計(jì)劃使用一個(gè)超大數(shù)據(jù)量的項(xiàng)目,而且需要事務(wù)處理或外鍵支持,那么你真的應(yīng)該直接使用 InnoDB方式。但需要記住InnoDB 的表需要更多的內(nèi)存和存儲(chǔ),轉(zhuǎn)換100GB 的MyISAM 表到InnoDB 表可能會(huì)讓你有非常壞的體驗(yàn)。???

===========================================================???

MyISAM:這個(gè)是默認(rèn)類型,它是基于傳統(tǒng)的ISAM類型,ISAM是 Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲(chǔ)記錄和文件的標(biāo)準(zhǔn)方法.與其他存儲(chǔ)引擎比較,MyISAM具有檢查和修復(fù)表格的大多數(shù)工具. MyISAM表格可以被壓縮,而且它們支持全文搜索.它們不是事務(wù)安全的,而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執(zhí)行大量 的SELECT,MyISAM是更好的選擇。???

InnoDB:這種類型是事務(wù)安全的.它與BDB類型具有相同的特性,它們還支持外鍵.InnoDB表格速度很快.具有比BDB還豐富的特性,因此如果需 要一個(gè)事務(wù)安全的存儲(chǔ)引擎,建議使用它.如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表,???

對(duì)于支持事物的InnoDB類型的標(biāo),影響速度的主要原因是AUTOCOMMIT默認(rèn)設(shè)置是打開的,而且程序沒有顯式調(diào)用BEGIN 開始事務(wù),導(dǎo)致每插入一條都自動(dòng)Commit,嚴(yán)重影響了速度。可以在執(zhí)行sql前調(diào)用begin,多條sql形成一個(gè)事物(即使autocommit打 開也可以),將大大提高性能。???

===============================================================???

InnoDB和MyISAM是在使用MySQL最常用的兩個(gè)表類型,各有優(yōu)缺點(diǎn),視具體應(yīng)用而定。下面是已知的兩者之間的差別,僅供參考。???

innodb???
InnoDB 給 MySQL 提供了具有事務(wù)(commit)、回滾(rollback)和崩潰修復(fù)能力 (crash recovery capabilities)的事務(wù)安全(transaction-safe (ACID compliant))型表。 InnoDB 提供了行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non- locking read in SELECTs)。這些特性均提高了多用戶并發(fā)操作的性能表現(xiàn)。在InnoDB表中不需要擴(kuò)大鎖定 (lock escalation),因?yàn)?InnoDB 的列鎖定(row level locks)適宜非常小的空間。 InnoDB 是 MySQL 上第一個(gè)提供外鍵約束(FOREIGN KEY constraints)的表引擎。???

InnoDB 的設(shè)計(jì)目標(biāo)是處理大容量數(shù)據(jù)庫系統(tǒng),它的 CPU 利用率是其它基于磁盤的關(guān)系數(shù)據(jù)庫引擎所不能比的。在技術(shù)上,InnoDB 是一套放在 MySQL 后臺(tái)的完整數(shù)據(jù)庫系統(tǒng),InnoDB 在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。 InnoDB 把數(shù)據(jù)和索引存放在表空間里,可能包含多個(gè)文件,這與其它的不一樣,舉例來說,在 MyISAM 中,表被存放在單獨(dú)的文件中。InnoDB 表的大小只受限于操作系統(tǒng)的文件大小,一般為 2 GB。???
InnoDB所有的表都保存在同一個(gè)數(shù)據(jù)文件 ibdata1 中(也可能是多個(gè)文件,或者是獨(dú)立的表空間文件),相對(duì)來說比較不好備份,免費(fèi)的方案可以是拷貝數(shù)據(jù)文件、備份 binlog,或者用 mysqldump。???


MyISAM???
MyISAM 是MySQL缺省存貯引擎 .???

每張MyISAM 表被存放在三個(gè)文件 。frm 文件存放表格定義。 數(shù)據(jù)文件是MYD (MYData) 。 索引文件是 MYI (MYIndex) 引伸。???

因?yàn)镸yISAM相對(duì)簡(jiǎn)單所以在效率上要優(yōu)于InnoDB..小型應(yīng)用使用MyISAM是不錯(cuò)的選擇.???

MyISAM表是保存成文件的形式,在跨平臺(tái)的數(shù)據(jù)轉(zhuǎn)移中使用MyISAM存儲(chǔ)會(huì)省去不少的麻煩???

以下是一些細(xì)節(jié)和具體實(shí)現(xiàn)的差別:???

1.InnoDB不支持FULLTEXT類型的索引。???
2.InnoDB 中不保存表的具體行數(shù),也就是說,執(zhí)行select count(*) from table時(shí),InnoDB要掃描一遍整個(gè)表來計(jì)算有多少行,但是MyISAM只要簡(jiǎn)單的讀出保存好的行數(shù)即可。注意的是,當(dāng)count(*)語句包含 where條件時(shí),兩種表的操作是一樣的。???
3.對(duì)于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。???
4.DELETE FROM table時(shí),InnoDB不會(huì)重新建立表,而是一行一行的刪除。???
5.LOAD TABLE FROM MASTER操作對(duì)InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導(dǎo)入數(shù)據(jù)后再改成InnoDB表,但是對(duì)于使用的額外的InnoDB特性(例如外鍵)的表不適用。???

另外,InnoDB表的行鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表,例如 update table set num=1 where name like “%aaa%”???

任何一種表都不是萬能的,只用恰當(dāng)?shù)尼槍?duì)業(yè)務(wù)類型來選擇合適的表類型,才能最大的發(fā)揮MySQL的性能優(yōu)勢(shì)。???

===============================================================???


以下是InnoDB和MyISAM的一些聯(lián)系和區(qū)別!???

1. 4.0以上mysqld都支持事務(wù),包括非max版本。3.23的需要max版本mysqld才能支持事務(wù)。???

2. 創(chuàng)建表時(shí)如果不指定type則默認(rèn)為myisam,不支持事務(wù)。???
可以用 show create table tablename 命令看表的類型。???

2.1 對(duì)不支持事務(wù)的表做start/commit操作沒有任何效果,在執(zhí)行commit前已經(jīng)提交,測(cè)試:???
執(zhí)行一個(gè)msyql:???
use test;???
drop table if exists tn;???
create table tn (a varchar(10)) type=myisam;???
drop table if exists ty;???
create table ty (a varchar(10)) type=innodb;???

begin;???
insert into tn values(‘a(chǎn)’);???
insert into ty values(‘a(chǎn)’);???
select * from tn;???
select * from ty;???
都能看到一條記錄???

執(zhí)行另一個(gè)mysql:???
use test;???
select * from tn;???
select * from ty;???
只有tn能看到一條記錄???
然后在另一邊???
commit;???
才都能看到記錄。???

3. 可以執(zhí)行以下命令來切換非事務(wù)表到事務(wù)(數(shù)據(jù)不會(huì)丟失),innodb表比myisam表更安全:???
?? alter table tablename type=innodb;???

3.1 innodb表不能用repair table命令和myisamchk -r table_name???
但可以用check table,以及mysqlcheck [OPTIONS] database [tables]???

==============================================================???

mysql中使用select for update的必須針對(duì)InnoDb,并且是在一個(gè)事務(wù)中,才能起作用。???

select的條件不一樣,采用的是行級(jí)鎖還是表級(jí)鎖也不一樣。???
轉(zhuǎn)http://www.neo.com.tw/archives/900?的說明???

由于InnoDB 預(yù)設(shè)是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL 才會(huì)執(zhí)行Row lock (只鎖住被選取的資料例) ,否則MySQL 將會(huì)執(zhí)行Table Lock (將整個(gè)資料表單給鎖住)。???


舉個(gè)例子:???

假設(shè)有個(gè)表單products ,里面有id 跟name 二個(gè)欄位,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 WHERE name=’Mouse’ FOR UPDATE;???

例3: (主鍵不明確,table lock)???

SELECT * FROM products WHERE id’3′ FOR UPDATE;???

例4: (主鍵不明確,table lock)???

SELECT * FROM products WHERE id LIKE ’3′ FOR UPDATE;???

注1:???
FOR UPDATE 僅適用于InnoDB,且必須在交易區(qū)塊(BEGIN/COMMIT)中才能生效

PHP速學(xué)教程(入門到精通)
PHP速學(xué)教程(入門到精通)

PHP怎么學(xué)習(xí)?PHP怎么入門?PHP在哪學(xué)?PHP怎么學(xué)才快?不用擔(dān)心,這里為大家提供了PHP速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://m.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)