《Mysql入門(mén)簡(jiǎn)單介紹MySQL中的事務(wù)機(jī)制》要點(diǎn):
本文介紹了Mysql入門(mén)簡(jiǎn)單介紹MySQL中的事務(wù)機(jī)制,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
從一個(gè)問(wèn)題開(kāi)始MYSQL教程
最近銀行這個(gè)事情鬧的比擬厲害啊,很多儲(chǔ)戶的錢(qián)放在銀行,就不翼而飛了,而銀行還不管不問(wèn),說(shuō)是用戶的責(zé)任,打官司,用戶還能輸了,這就是“社會(huì)主義”.咱還是少發(fā)牢騷,多種樹(shù),莫談國(guó)事.MYSQL教程
說(shuō)到銀行存錢(qián),就不得不說(shuō)一下從銀行取錢(qián)這件事情,從ATM機(jī)取錢(qián)這件簡(jiǎn)單的事情,實(shí)際上主要分為以下幾個(gè)步調(diào):MYSQL教程
一個(gè)簡(jiǎn)單的取錢(qián),主要分為以上幾步.不知道大家有沒(méi)有“天真”的想過(guò),如果在第5步中,后臺(tái)數(shù)據(jù)庫(kù)中已經(jīng)把錢(qián)減掉了,但是ATM還就是沒(méi)有吐出錢(qián)(雖然實(shí)際也發(fā)生過(guò),但是畢竟是低概率事件),這該怎么辦?MYSQL教程
關(guān)于這個(gè)問(wèn)題,銀行系統(tǒng)的開(kāi)發(fā)人員早就想過(guò)了,那么他們是怎么來(lái)搞定這個(gè)問(wèn)題的呢?這就要說(shuō)到本日總結(jié)的事務(wù)這個(gè)概念了.
簡(jiǎn)單說(shuō)說(shuō)事務(wù)MYSQL教程
對(duì)于上面的取錢(qián)這個(gè)事情,如果有一步出現(xiàn)了錯(cuò)誤,那么就取消整個(gè)取錢(qián)的動(dòng)作;簡(jiǎn)單來(lái)說(shuō),便是取錢(qián)這7步,要么都完成,要么就啥也不做.在數(shù)據(jù)庫(kù)中,事務(wù)也是這個(gè)道理.MYSQL教程
事務(wù)由一條或者多條sql語(yǔ)句組成,在事務(wù)中的操作,這些sql語(yǔ)句要么都執(zhí)行,要么都不執(zhí)行,這便是事務(wù)的目的.MYSQL教程
對(duì)于事務(wù)而言,它必要滿足ACID特性,下面就簡(jiǎn)要的說(shuō)說(shuō)事務(wù)的ACID特性.MYSQL教程
??? A,表示原子性;原子性指整個(gè)數(shù)據(jù)庫(kù)事務(wù)是不可分割的工作單位.只有使事務(wù)中所有的數(shù)據(jù)庫(kù)操作都執(zhí)行成功,整個(gè)事務(wù)的執(zhí)行才算成功.事務(wù)中任何一個(gè)sql語(yǔ)句執(zhí)行失敗,那么已經(jīng)執(zhí)行成功的sql語(yǔ)句也必需撤銷(xiāo),數(shù)據(jù)庫(kù)狀態(tài)應(yīng)該退回到執(zhí)行事務(wù)前的狀態(tài);
??? C,表示一致性;也就是說(shuō)一致性指事務(wù)將數(shù)據(jù)庫(kù)從一種狀態(tài)轉(zhuǎn)變?yōu)榱硪环N一致的狀態(tài),在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞;
??? I,表示隔離性;隔離性也叫做并發(fā)控制、可串行化或者鎖.事務(wù)的隔離性要求每個(gè)讀寫(xiě)事務(wù)的對(duì)象與其它事務(wù)的操作對(duì)象能相互分離,即該事務(wù)提交前對(duì)其它事務(wù)都不可見(jiàn),這通常使用鎖來(lái)實(shí)現(xiàn);
??? D,持久性,表示事務(wù)一旦提交了,其結(jié)果就是永久性的,也就是數(shù)據(jù)就已經(jīng)寫(xiě)入到數(shù)據(jù)庫(kù)了,如果發(fā)生了宕機(jī)等事故,數(shù)據(jù)庫(kù)也能將數(shù)據(jù)恢復(fù).MYSQL教程
總結(jié)了一些事務(wù)的基本概念,在MySQL中,事務(wù)還是分為很多中的,下面就來(lái)看看到底有哪些事務(wù).
有哪些事務(wù)MYSQL教程
你能想象到嗎?就這么個(gè)破事務(wù)還會(huì)分以下這么多種:MYSQL教程
現(xiàn)在就來(lái)對(duì)這些事務(wù)從概念的層面上進(jìn)行簡(jiǎn)單的總結(jié)一下.MYSQL教程
??? 扁平事務(wù)
??? 扁平事務(wù)是最簡(jiǎn)單的一種,也是實(shí)際開(kāi)發(fā)中使用的最多的一種事務(wù).在這種事務(wù)中,所有操作都處于同一條理,最常見(jiàn)的方式如下:MYSQL教程
BEGIN WORK Operation 1 Operation 2 Operation 3 ... Operation N COMMIT WORK
??? 或者是這種:MYSQL教程
BEGIN WORK Operation 1 Operation 2 Operation 3 ... Operation N (Error Occured) ROLLBACK WORK
??? 扁平事務(wù)的主要缺點(diǎn)是不能提交或回滾事務(wù)的某一部分,或者分幾個(gè)獨(dú)立的步驟去提交.好比有這樣的一個(gè)例子,我從呼和浩特去深圳,為了便宜,我可能這么干:MYSQL教程
BEGIN WORK Operation1:呼和浩特---火車(chē)--->北京 Operation2:北京---飛機(jī)--->深圳 ROLLBACK WORK
??? 但是,如果Operation1,從呼和浩特到北京的火車(chē)晚點(diǎn)了,錯(cuò)過(guò)了航班,怎么辦?感覺(jué)扁平事務(wù)的特性,那我就需要回滾,我再回到呼和浩特,那么這樣成本是不是也太高了啊,所以就有了下面的第二種事務(wù)――帶有保留點(diǎn)的扁平事務(wù).
??? 帶有保留點(diǎn)的扁平事務(wù)
??? 這種事務(wù)除了支持扁平事務(wù)支持的操作外,允許在事務(wù)執(zhí)行過(guò)程中回滾到同一事務(wù)中較早的一個(gè)狀態(tài),這是因?yàn)榭赡苣承┦聞?wù)在執(zhí)行過(guò)程中出現(xiàn)的錯(cuò)誤并不會(huì)對(duì)所有的操作都無(wú)效,放棄整個(gè)事務(wù)不合乎要求,開(kāi)銷(xiāo)也太大.保留點(diǎn)用來(lái)通知系統(tǒng)應(yīng)該記住事務(wù)當(dāng)前的狀態(tài),以便以后發(fā)生錯(cuò)誤時(shí),事務(wù)能回到該狀態(tài).
??? 鏈?zhǔn)聞?wù)
??? 鏈?zhǔn)聞?wù),就是指回滾時(shí),只能恢復(fù)到最近一個(gè)保留點(diǎn);而帶有保留點(diǎn)的扁平事務(wù)則可以回滾到任意正確的保留點(diǎn).
??? 嵌套事務(wù)
??? 看下面這個(gè),你就能明白了,啥是嵌套事務(wù):MYSQL教程
BEGIN WORK SubTransaction1: BEGIN WORK SubOperationX COMMIT WORK SubTransaction2: BEGIN WORK SubOperationY COMMIT WORK ... SubTransactionN: BEGIN WORK SubOperationN COMMIT WORK COMMIT WORK
??? 這便是嵌套事務(wù),在事務(wù)中再嵌套事務(wù),位于根節(jié)點(diǎn)的事務(wù)稱(chēng)為頂層事務(wù).事務(wù)的前驅(qū)稱(chēng)為父事務(wù),其它事務(wù)稱(chēng)為子事務(wù).事務(wù)的前驅(qū)稱(chēng)為父事務(wù),事務(wù)的下一層稱(chēng)為子事務(wù).MYSQL教程
??? 子事務(wù)既可以提交也可以回滾,但是它的提交操作并不馬上生效,除非由其父事務(wù)提交.因此就可以確定,任何子事務(wù)都在頂層事務(wù)提交后才真正的被提交了.同理,任意一個(gè)事務(wù)的回滾都會(huì)引起它的所有子事務(wù)一同回滾.
??? 分布式事務(wù)
??? 分布式事務(wù)通常是指在一個(gè)分布式環(huán)境下運(yùn)行的扁平事務(wù),因此需要根據(jù)數(shù)據(jù)所在位置拜訪網(wǎng)絡(luò)中的不同節(jié)點(diǎn),比如:通過(guò)建設(shè)銀行向招商銀行轉(zhuǎn)賬,建設(shè)銀行和招商銀行肯定用的不是同一個(gè)數(shù)據(jù)庫(kù),同時(shí)二者的數(shù)據(jù)庫(kù)也不在一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)上,那么當(dāng)用戶跨行轉(zhuǎn)賬,就是通過(guò)分布式事務(wù)來(lái)保證數(shù)據(jù)的ACID的.MYSQL教程
MySQL中使用事務(wù)MYSQL教程
理論總結(jié)的再好,終歸都要通過(guò)實(shí)踐來(lái)進(jìn)行理解.下面就來(lái)說(shuō)說(shuō)MySQL中是如何使用事務(wù)的.MYSQL教程
在MySQL命令行的默認(rèn)設(shè)置下,事務(wù)都是自動(dòng)提交的,即執(zhí)行SQL語(yǔ)句后就會(huì)馬上執(zhí)行COMMIT操作.因此要顯示地開(kāi)啟一個(gè)事務(wù)須使用命令BEGIN或START TRANSACTION,或者執(zhí)行命令SET AUTOCOMMIT=0,用來(lái)禁止使用當(dāng)前會(huì)話的自動(dòng)提交.MYSQL教程
來(lái)看看我們可以使用哪些事務(wù)控制語(yǔ)句.MYSQL教程
這些不用你“管”MYSQL教程
有的時(shí)候有些SQL語(yǔ)句會(huì)產(chǎn)生一個(gè)隱式的提交操作,即執(zhí)行完成這些語(yǔ)句后,會(huì)有一個(gè)隱式的COMMIT操作.有以下SQL語(yǔ)句,不消你去“管”:MYSQL教程
以上的這些SQL操作都是隱式的提交操作,不必要手動(dòng)顯式提交.
事務(wù)的隔離級(jí)別MYSQL教程
上面也說(shuō)到了SET TRANSACTION用來(lái)設(shè)置事務(wù)的隔離級(jí)別.那事務(wù)的隔離級(jí)別是什么東東?MYSQL教程
??? 在數(shù)據(jù)庫(kù)操作中,為了有效保證并發(fā)讀取數(shù)據(jù)的正確性,提出的事務(wù)隔離級(jí)別.MYSQL教程
InnoDB存儲(chǔ)引擎提供事務(wù)的隔離級(jí)別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE.這些隔離級(jí)別之間的區(qū)別如下:
MYSQL教程
MYSQL教程
隔離級(jí)別越低,事務(wù)哀求的鎖越少或保持鎖的時(shí)間就越短.InnoDB存儲(chǔ)引擎默認(rèn)的支持隔離級(jí)別是REPEATABLE READ;在這種默認(rèn)的事務(wù)隔離級(jí)別下已經(jīng)能完全保證事務(wù)的隔離性要求,即達(dá)到SQL標(biāo)準(zhǔn)的SERIALIZABLE級(jí)別隔離.MYSQL教程
我們可以可以用SET TRANSACTION語(yǔ)句改變單個(gè)會(huì)話或者所有新進(jìn)連接的隔離級(jí)別.它的語(yǔ)法如下:MYSQL教程
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
注意:默認(rèn)的行為(不帶session和global)是為下一個(gè)(未開(kāi)始)事務(wù)設(shè)置隔離級(jí)別.如果使用GLOBAL關(guān)鍵字,語(yǔ)句在全局對(duì)從那點(diǎn)開(kāi)始創(chuàng)建的所有新連接(除了不存在的連接)設(shè)置默認(rèn)事務(wù)級(jí)別.你必要SUPER權(quán)限來(lái)做這個(gè).使用SESSION 關(guān)鍵字為將來(lái)在當(dāng)前連接上執(zhí)行的事務(wù)設(shè)置默認(rèn)事務(wù)級(jí)別. 任何客戶端都能自由改變會(huì)話隔離級(jí)別(甚至在事務(wù)的中間),或者為下一個(gè)事務(wù)設(shè)置隔離級(jí)別.MYSQL教程
mysql> set session transaction isolation level repeatable read; Query OK, 0 rows affected (0.00 sec) mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec)
總結(jié)MYSQL教程
這篇文章,基本上都是理論概念的堆積,實(shí)戰(zhàn)的東西基本沒(méi)有.然則,這些都不是問(wèn)題,這也無(wú)法阻擋這篇文章成為一篇讀者喜歡的文章,是吧.好了,這篇關(guān)于MySQL中事務(wù)的文章就到此結(jié)束,以后如果有新的東西,就接著總結(jié).
MYSQL教程
《Mysql入門(mén)簡(jiǎn)單介紹MySQL中的事務(wù)機(jī)制》是否對(duì)您有啟發(fā),歡迎查看更多與《Mysql入門(mén)簡(jiǎn)單介紹MySQL中的事務(wù)機(jī)制》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/9908.html