?
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括邗江網(wǎng)站建設(shè)、邗江網(wǎng)站制作、邗江網(wǎng)頁(yè)制作以及邗江網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,邗江網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到邗江省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
?
?
transaction:
事務(wù),由若干條語(yǔ)句組成的,指要做的一系列操作;
InnoDB引擎,支持事務(wù);
?
atomicity,一個(gè)事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中包括的所有操作要么全部做完,要做什么都不做;
consistency,事務(wù)必須是使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變成另一個(gè)一致性狀態(tài),一致性和原子性是密切相關(guān)的;
isolation,一個(gè)事務(wù)的執(zhí)行不能被其它事務(wù)干擾,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)的其它事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾;
durability,持久性也稱永久性permanence,指一個(gè)事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就應(yīng)該是永久性的,接下來(lái)的其它操作或故障不應(yīng)該對(duì)其有任何影響;
?
注:
atomicity要求事務(wù)中的所有操作,不可分割,不能做了一部分操作,還剩一部分操作;
consistency,多個(gè)事務(wù)并行執(zhí)行的結(jié)果,應(yīng)該和事務(wù)排隊(duì)執(zhí)行的結(jié)果一致,如果事務(wù)的并行執(zhí)行和多線程讀寫共享資源一樣不可預(yù)期,就不能保證一致性;
isolation,指多個(gè)事務(wù)訪問(wèn)共同的數(shù)據(jù)了,應(yīng)該互不干擾,隔離性指究竟在一個(gè)事務(wù)處理期間,其它事務(wù)能不能訪問(wèn)的問(wèn)題;
durability,事務(wù)提交后,數(shù)據(jù)不能丟失;
?
?
不允許事務(wù)A和事務(wù)B并行;
例,事務(wù)A和事務(wù)B,更新同一個(gè)數(shù)據(jù),它們都讀取了初始值100,A要減10,B要加100,A減去10后更新為90,B加100更新為200,A的更新丟失了;
?
只用于展示可以,用于計(jì)算可以;
事務(wù)B讀到了事務(wù)A未提交的數(shù)據(jù),這個(gè)數(shù)據(jù)可能是一個(gè)中間值,也可能事務(wù)A之后回滾事務(wù),事務(wù)A是否最后提交并不關(guān)心,只要讀到了這個(gè)被修改的數(shù)據(jù)就是臟讀,隔離不好,讀到了未提交的數(shù)據(jù)(中間狀態(tài)值);
?
允許后一次可讀到正確的內(nèi)容;
不能保證同一條查詢語(yǔ)句重復(fù)讀相同的結(jié)果,就是不可重復(fù)讀;
例,事務(wù)A在同一事務(wù)中執(zhí)行相同查詢語(yǔ)句(先后查詢了2次),得到了不同的結(jié)果(不能重復(fù)的獲取相同數(shù)據(jù));
例,事務(wù)A在查詢了一次后,事務(wù)B修改了數(shù)據(jù),事務(wù)A又查詢一次,發(fā)現(xiàn)數(shù)據(jù)不一致了;沒(méi)說(shuō)提交;
注:臟讀是可以讀到相同數(shù)據(jù)的,但讀取的是一個(gè)未提交的數(shù)據(jù),不是提交的最終結(jié)果;
?
例,事務(wù)A中同一個(gè)查詢要進(jìn)行多次,事務(wù)B插入數(shù)據(jù),導(dǎo)致事務(wù)A返回了不同的結(jié)果集,如同幻覺(jué);
數(shù)據(jù)集有記錄增加了,可以看作是增加了記錄的不可重復(fù)讀;
?
有以上問(wèn)題,數(shù)據(jù)庫(kù)必須要解決,解決辦法:1、隔離級(jí)別;2、加鎖;
?
由低到高,依次為:
read uncommitted,讀取到未提交數(shù)據(jù),讀不受約束;
read commited,讀已經(jīng)提交的數(shù)據(jù),oralce默認(rèn);
repeabable read,可以重復(fù)讀,MySQL默認(rèn),解決不可重復(fù)讀;
serializable,串行化,事務(wù)間完全隔離,不能并發(fā)只能串行,解決了所有問(wèn)題;
?
隔離級(jí)別越高,串行化越高,數(shù)據(jù)庫(kù)執(zhí)行效率越低,當(dāng)前事務(wù)處理的中間結(jié)果對(duì)其它事務(wù)不可見(jiàn)程度越高;
隔離級(jí)別越低,并行度越高,性能越高;
?
會(huì)話級(jí)別|全局級(jí)別:
>set [session|global] transaction isolation level LEVEL;?? #生產(chǎn)中慎用global
>select @@global.tx_isolation;
>select @@tx_isolation;
>set session transaction isolation level read committed;
?
serializable,串行了,解決所有問(wèn)題;
?
repeatable read:
事務(wù)A中同一條查詢語(yǔ)句返回同樣的結(jié)果,就是可以重復(fù)讀數(shù)據(jù)了,解決辦法有:
1、對(duì)select的數(shù)據(jù)加鎖,不允許其它事務(wù)有刪除、修改操作,如for update;
2、第一次select時(shí),對(duì)最后一次確切提交的事務(wù)的結(jié)果的快照;
以上解決了不可重復(fù)讀,但有可能出現(xiàn)幻讀;
?
read committed:
在事務(wù)中,每次select可以讀到別的事務(wù)剛提交成功的新的數(shù)據(jù),因?yàn)樽x到的是提交后的數(shù)據(jù),解決了臟讀,但不能解決不可重復(fù)讀的問(wèn)題;
?
read uncommitted:
能讀取到別的事務(wù)還沒(méi)提交的數(shù)據(jù),完全沒(méi)有隔離性可言,出現(xiàn)了臟讀;
?
事務(wù)語(yǔ)法:
>start transaction?? #或>begin開(kāi)始一個(gè)事務(wù),>start transaction是標(biāo)準(zhǔn)sql語(yǔ)法;
>commit?? #提交事務(wù)后,變更成為永久變更;
>rollback?? #可在提交事務(wù)之前,回滾變更,事務(wù)中的操作就如同沒(méi)有發(fā)生過(guò)一樣;
>set autocommit=0?? #默認(rèn)autocommit模式,可禁用或啟用,用于當(dāng)前連接,出錯(cuò)也可自動(dòng)回滾,0禁用自動(dòng)提交事務(wù),如果開(kāi)啟自動(dòng)提交,若有一個(gè)修改表的語(yǔ)句,執(zhí)行后會(huì)立即把更新存儲(chǔ)到磁盤;開(kāi)發(fā)時(shí)一般會(huì)關(guān)掉此項(xiàng),性能問(wèn)題,是一批批的提交,而不是一句句的提交;
?
?
本質(zhì)上來(lái)說(shuō)沒(méi)有區(qū)別,都是存放數(shù)據(jù)的地方;
數(shù)據(jù)庫(kù)支持在線業(yè)務(wù),需要頻繁增刪改查;數(shù)據(jù)倉(cāng)庫(kù)一般囤積歷史數(shù)據(jù)支持用于分析的SQL,一般不建議刪改;
?
數(shù)據(jù)庫(kù)關(guān)注數(shù)據(jù)的持久化、數(shù)據(jù)的關(guān)系,為業(yè)務(wù)系統(tǒng)提供支持、事務(wù)支持;
OLTP,在線交易數(shù)據(jù),數(shù)據(jù)庫(kù);
?
數(shù)據(jù)倉(cāng)庫(kù),存儲(chǔ)的數(shù)據(jù)是為了分析或者發(fā)掘而設(shè)計(jì)的表結(jié)構(gòu),可以存儲(chǔ)海量數(shù)據(jù);
數(shù)據(jù)倉(cāng)庫(kù)存儲(chǔ)歷史數(shù)據(jù)用于分析OLAP;
?
?
操作查詢的結(jié)果集的一種方法;
可將游標(biāo)當(dāng)作一個(gè)指針,指向結(jié)果集中的某一行;
?
這兩種技術(shù)是DB的高級(jí)內(nèi)容,但基本很少用了,邏輯前移,BS|CS放在B或C上了;
stored procedure,數(shù)據(jù)庫(kù)系統(tǒng)中,一段完成特定功能的SQL語(yǔ)句,編寫成類似函數(shù)的方式,可以傳參并調(diào)用,支持流程控制語(yǔ)句;
trigger,由事件觸發(fā)的特殊的存儲(chǔ)過(guò)程,如Insert數(shù)據(jù)時(shí)觸發(fā);trigger功能雖強(qiáng)大,但會(huì)有性能問(wèn)題;
?
?
例:
mysql> set autocommit=0;
mysql> show variables like 'autocommit';
mysql> show variables like 'tx_isolation';
mysql> select * from t;
mysql> set session transaction isolation level read committed;
?
注:
set autocommit=0;關(guān)閉自動(dòng)提交;
兩個(gè)窗口均默認(rèn)級(jí)別REPEATABLE-READ,
A端update t set id=4 where id=2,
A端未commit,A端查詢是改變后的狀態(tài),B端查詢沒(méi)變化,
A端commit后,A端查詢是改變后的狀態(tài),B端查詢沒(méi)變化,
B端commit后,B端查詢是改變后的狀態(tài);
?
兩個(gè)窗口用READ-COMMITTED,>set session transaction isolation level read committed;
A端insert into t values(6,'ftp',28);,
A端未commit,A端查詢是改變后的狀態(tài),B端查詢沒(méi)變化;
A端commit,A端查詢是改變后的狀態(tài),B端查詢是改變后的狀態(tài);
?
mysql> select * from t for update;?? #InnoDB是行級(jí)鎖,此句相當(dāng)于表級(jí)鎖;使用時(shí),用幾行加幾行鎖,且加鎖時(shí)間越短越好
mysql> commit;?? #未commit,其它窗口的mysql> update t set id=5 where id=6;更新語(yǔ)句會(huì)卡住
?
?
?
本文名稱:58數(shù)據(jù)庫(kù)3_transaction
URL標(biāo)題:http://aaarwkj.com/article34/iipcse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、企業(yè)網(wǎng)站制作、軟件開(kāi)發(fā)、網(wǎng)站改版、動(dòng)態(tài)網(wǎng)站、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)