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