国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - 簡單介紹MySQL中的事務機制

簡單介紹MySQL中的事務機制

2020-05-03 15:59楊國棟 Mysql

這篇文章主要介紹了MySQL中的事務機制,通過實例介紹了大概的流程,需要的朋友可以參考下

從一個問題開始

最近銀行這個事情鬧的比較厲害啊,很多儲戶的錢放在銀行,就不翼而飛了,而銀行還不管不問,說是用戶的責任,打官司,用戶還能輸了,這就是“社會主義”。咱還是少發牢騷,多種樹,莫談國事。

說到銀行存錢,就不得不說一下從銀行取錢這件事情,從ATM機取錢這件簡單的事情,實際上主要分為以下幾個步驟:

  1.     登陸ATM機,輸入密碼;
  2.     連接數據庫,驗證密碼;
  3.     驗證成功,獲得用戶信息,比如存款余額等;
  4.     用戶輸入需要取款的金額,按下確認鍵;
  5.     從后臺數據庫中減掉用戶賬戶上的對應金額;
  6.     ATM吐出錢;
  7.     用戶把錢拿走。

一個簡單的取錢,主要分為以上幾步。不知道大家有沒有“天真”的想過,如果在第5步中,后臺數據庫中已經把錢減掉了,但是ATM還就是沒有吐出錢(雖然實際也發生過,但是畢竟是低概率事件),這該怎么辦?

關于這個問題,銀行系統的開發人員早就想過了,那么他們是怎么來搞定這個問題的呢?這就要說到今天總結的事務這個概念了。
簡單說說事務

對于上面的取錢這個事情,如果有一步出現了錯誤,那么就取消整個取錢的動作;簡單來說,就是取錢這7步,要么都完成,要么就啥也不做。在數據庫中,事務也是這個道理。

事務由一條或者多條sql語句組成,在事務中的操作,這些sql語句要么都執行,要么都不執行,這就是事務的目的。

對于事務而言,它需要滿足ACID特性,下面就簡要的說說事務的ACID特性。

    A,表示原子性;原子性指整個數據庫事務是不可分割的工作單位。只有使事務中所有的數據庫操作都執行成功,整個事務的執行才算成功。事務中任何一個sql語句執行失敗,那么已經執行成功的sql語句也必須撤銷,數據庫狀態應該退回到執行事務前的狀態;
    C,表示一致性;也就是說一致性指事務將數據庫從一種狀態轉變為另一種一致的狀態,在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞;
    I,表示隔離性;隔離性也叫做并發控制、可串行化或者鎖。事務的隔離性要求每個讀寫事務的對象與其它事務的操作對象能相互分離,即該事務提交前對其它事務都不可見,這通常使用鎖來實現;
    D,持久性,表示事務一旦提交了,其結果就是永久性的,也就是數據就已經寫入到數據庫了,如果發生了宕機等事故,數據庫也能將數據恢復。

總結了一些事務的基本概念,在MySQL中,事務還是分為很多中的,下面就來看看到底有哪些事務。
有哪些事務

你能想象到嗎?就這么個破事務還會分以下這么多種:

  1.     扁平事務;
  2.     帶有保存點的扁平事務;
  3.     鏈事務;
  4.     嵌套事務;
  5.     分布式事務。

現在就來對這些事務從概念的層面上進行簡單的總結一下。

    扁平事務
    扁平事務是最簡單的一種,也是實際開發中使用的最多的一種事務。在這種事務中,所有操作都處于同一層次,最常見的方式如下:

?
1
2
3
4
5
6
7
BEGIN WORK
  Operation 1
  Operation 2
  Operation 3
  ...
  Operation N
COMMIT WORK

    或者是這種:

?
1
2
3
4
5
6
7
8
BEGIN WORK
  Operation 1
  Operation 2
  Operation 3
  ...
  Operation N
  (Error Occured)
ROLLBACK WORK

    扁平事務的主要缺點是不能提交或回滾事務的某一部分,或者分幾個獨立的步驟去提交。比如有這樣的一個例子,我從呼和浩特去深圳,為了便宜,我可能這么干:

?
1
2
3
4
BEGIN WORK
  Operation1:呼和浩特---火車--->北京
  Operation2:北京---飛機--->深圳
ROLLBACK WORK

    但是,如果Operation1,從呼和浩特到北京的火車晚點了,錯過了航班,怎么辦?感覺扁平事務的特性,那我就需要回滾,我再回到呼和浩特,那么這樣成本是不是也太高了啊,所以就有了下面的第二種事務——帶有保存點的扁平事務。
    帶有保存點的扁平事務
    這種事務除了支持扁平事務支持的操作外,允許在事務執行過程中回滾到同一事務中較早的一個狀態,這是因為可能某些事務在執行過程中出現的錯誤并不會對所有的操作都無效,放棄整個事務不合乎要求,開銷也太大。保存點用來通知系統應該記住事務當前的狀態,以便以后發生錯誤時,事務能回到該狀態。
    鏈事務
    鏈事務,就是指回滾時,只能恢復到最近一個保存點;而帶有保存點的扁平事務則可以回滾到任意正確的保存點。
    嵌套事務
    看下面這個,你就能明白了,啥是嵌套事務:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
BEGIN WORK
  SubTransaction1:
      BEGIN WORK
        SubOperationX
      COMMIT WORK
  SubTransaction2:
      BEGIN WORK
        SubOperationY
      COMMIT WORK
  ...
  SubTransactionN:
      BEGIN WORK
        SubOperationN
      COMMIT WORK
COMMIT WORK

    這就是嵌套事務,在事務中再嵌套事務,位于根節點的事務稱為頂層事務。事務的前驅稱為父事務,其它事務稱為子事務。事務的前驅稱為父事務,事務的下一層稱為子事務。

    子事務既可以提交也可以回滾,但是它的提交操作并不馬上生效,除非由其父事務提交。因此就可以確定,任何子事務都在頂層事務提交后才真正的被提交了。同理,任意一個事務的回滾都會引起它的所有子事務一同回滾。
    分布式事務
    分布式事務通常是指在一個分布式環境下運行的扁平事務,因此需要根據數據所在位置訪問網絡中的不同節點,比如:通過建設銀行向招商銀行轉賬,建設銀行和招商銀行肯定用的不是同一個數據庫,同時二者的數據庫也不在一個網絡節點上,那么當用戶跨行轉賬,就是通過分布式事務來保證數據的ACID的。

MySQL中使用事務

理論總結的再好,終歸都要通過實踐來進行理解。下面就來說說MySQL中是如何使用事務的。

在MySQL命令行的默認設置下,事務都是自動提交的,即執行SQL語句后就會馬上執行COMMIT操作。因此要顯示地開啟一個事務須使用命令BEGIN或START TRANSACTION,或者執行命令SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。

來看看我們可以使用哪些事務控制語句。

  1.     BEGIN或START TRANSACTION;顯示地開啟一個事務;
  2.     COMMIT;也可以使用COMMIT WORK,不過二者是等價的。COMMIT會提交事務,并使已對數據庫進行的所有修改稱為永久性的;
  3.     ROLLBACK;有可以使用ROLLBACK WORK,不過二者是等價的?;貪L會結束用戶的事務,并撤銷正在進行的所有未提交的修改;
  4.     SAVEPOINT identifier;SAVEPOINT允許在事務中創建一個保存點,一個事務中可以有多個SAVEPOINT;
  5.     RELEASE SAVEPOINT identifier;刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;
  6.     ROLLBACK TO identifier;把事務回滾到標記點;
  7.     SET TRANSACTION;用來設置事務的隔離級別。InnoDB存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

這些不用你“管”

有的時候有些SQL語句會產生一個隱式的提交操作,即執行完成這些語句后,會有一個隱式的COMMIT操作。有以下SQL語句,不用你去“管”:

  •     DDL語句,ALTER DATABASE、ALTER EVENT、ALTER PROCEDURE、ALTER TABLE、ALTER VIEW、CREATE TABLE、DROP TABLE、RENAME TABLE、TRUNCATE TABLE等;
  •     修改MYSQL架構的語句,CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD;
  •     管理語句,ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE等。

以上的這些SQL操作都是隱式的提交操作,不需要手動顯式提交。
事務的隔離級別

上面也說到了SET TRANSACTION用來設置事務的隔離級別。那事務的隔離級別是什么東東?

    在數據庫操作中,為了有效保證并發讀取數據的正確性,提出的事務隔離級別。

InnoDB存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。這些隔離級別之間的區別如下:

簡單介紹MySQL中的事務機制

  •     臟讀:一個事務讀取到了另外一個事務沒有提交的數據;
  •     比如:事務T1更新了一行記錄的內容,但是并沒有提交所做的修改。事務T2讀取到了T1更新后的行,然后T1執行回滾操作,取消了剛才所做的修改?,F在T2所讀取的行就無效了;
  •     不可重復讀:在同一事務中,兩次讀取同一數據,得到內容不同;
  •     比如:事務T1讀取一行記錄,緊接著事務T2修改了T1剛才讀取的那一行記錄。然后T1又再次讀取這行記錄,發現與剛才讀取的結果不同。這就稱為“不可重復”讀,因為T1原來讀取的那行記錄已經發生了變化;
  •     幻讀:同一事務中,用同樣的操作讀取兩次,得到的記錄數不相同;
  •     比如:事務T1讀取一條指定的WHERE子句所返回的結果集。然后事務T2新插入 一行記錄,這行記錄恰好可以滿足T1所使用的查詢條件中的WHERE子句的條件。然后T1又使用相同的查詢再次對表進行檢索,但是此時卻看到了事務T2剛才插入的新行。這個新行就稱為“幻像”,因為對T1來說這一行就像突然出現的一樣。

隔離級別越低,事務請求的鎖越少或保持鎖的時間就越短。InnoDB存儲引擎默認的支持隔離級別是REPEATABLE READ;在這種默認的事務隔離級別下已經能完全保證事務的隔離性要求,即達到SQL標準的SERIALIZABLE級別隔離。

我們可以可以用SET TRANSACTION語句改變單個會話或者所有新進連接的隔離級別。它的語法如下:

?
1
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

注意:默認的行為(不帶session和global)是為下一個(未開始)事務設置隔離級別。如果使用GLOBAL關鍵字,語句在全局對從那點開始創建的所有新連接(除了不存在的連接)設置默認事務級別。你需要SUPER權限來做這個。使用SESSION 關鍵字為將來在當前連接上執行的事務設置默認事務級別。 任何客戶端都能自由改變會話隔離級別(甚至在事務的中間),或者為下一個事務設置隔離級別。

?
1
2
3
4
5
6
7
8
9
10
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中事務的文章就到此結束,以后如果有新的東西,就接著總結。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 爱色av·com| 在线观看国产 | 亚洲日日摸夜夜夜夜夜爽小说 | www.国产精品 | 青青草久久| 激情网站免费 | 亚洲精品一级 | 久一久久| 欧美日韩精品免费观看 | 亚洲福利一区二区 | 中文字幕av一区二区三区 | 亚洲成人精品在线观看 | 成人精品免费视频 | 亚洲精品成人av | 亚洲成人精品久久 | 日日爱视频| 亚洲成人一区二区 | 午夜视频在线免费观看 | 九九精品在线 | 国产亚洲欧美美 | 91久久精品国产亚洲a∨麻豆 | 亚洲精品久久久一区二区三区 | 国产精品亚洲视频 | 一区二区三区高清 | 国产精品精品 | 中文字幕一区二区三区在线观看 | 欧美a在线 | 网站黄色在线观看免费 | 国产精品美女久久久久久久网站 | 久久中文字幕精品 | 国产久 | 欧美视频第一页 | 国产在线精品一区 | 国产高清美女一级a毛片久久 | 一级毛片一级毛片一级毛片 | 久久久久久av | 亚洲成人av在线 | 日本久久综合 | 中日韩一线二线三线视频 | 亚洲在看| 蜜桃免费一区二区三区 |