成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據庫事務的四大特性以及事務的隔離級別

運維 數據庫運維
本篇講述數據庫中事務的四大特性(ACID)包括 原子性、 一致性、隔離性和持久性,并且將會詳細地說明事務的隔離級別。

數據庫事務的四大特性以及事務的隔離級別

本篇講述數據庫中事務的四大特性(ACID),并且將會詳細地說明事務的隔離級別。

如果一個數據庫聲稱支持事務的操作,那么該數據庫必須要具備以下四個特性:

⑴ 原子性(Atomicity)

原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾,這和前面兩篇博客介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。

⑵ 一致性(Consistency)

一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處于一致性狀態。

拿轉賬來說,假設用戶 A 和用戶 B 兩者的錢加起來一共是 5000,那么不管 A 和 B 之間如何轉賬,轉幾次賬,事務結束后兩個用戶的錢相加起來應該還得是 5000,這就是事務的一致性。

⑶ 隔離性(Isolation)

隔離性是當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離。

即要達到這么一種效果:對于任意兩個并發的事務 T1 和 T2,在事務 T1 看來,T2 要么在 T1 開始之前就已經結束,要么在 T1 結束之后才開始,這樣每個事務都感覺不到有其他事務在并發地執行。

關于事務的隔離性數據庫提供了多種隔離級別,稍后會介紹到。

⑷ 持久性(Durability)

持久性是指一個事務一旦被提交了,那么對數據庫中的數據的改變就是***性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。

例如我們在使用 JDBC 操作數據庫時,在提交事務方法后,提示用戶事務操作完成,當我們程序執行完成直到看到提示后,就可以認定事務以及正確提交,即使這時候數據庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是數據庫因為故障而沒有執行事務的重大錯誤。 

以上介紹完事務的四大特性 (簡稱 ACID),現在重點來說明下事務的隔離性,當多個線程都開啟事務操作數據庫中的數據時,數據庫系統要能進行隔離操作,以保證各個線程獲取數據的準確性,在介紹數據庫提供的各種隔離級別之前,我們先看看如果不考慮事務的隔離性,會發生的幾種問題:

1  臟讀

臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。

當一個事務正在多次修改某個數據,而在這個事務中這多次的修改都還未提交,這時一個并發的事務來訪問該數據,就會造成兩個事務得到的數據不一致。例如:用戶 A 向用戶 B 轉賬 100 元,對應 SQL 命令如下 

  1. update account set money=money+100 where name=’B’;  (此時A通知B)  
  2. update account set money=money - 100 where name=’A’;  

當只執行***條 SQL 時,A 通知 B 查看賬戶,B 發現確實錢已到賬(此時即發生了臟讀),而之后無論第二條 SQL 是否執行,只要該事務不提交,則所有操作都將回滾,那么當 B 以后再次查看賬戶時就會發現錢其實并沒有轉。

2 不可重復讀

不可重復讀是指在對于數據庫中的某個數據,一個事務范圍內多次查詢卻返回了不同的數據值,這是由于在查詢間隔,被另一個事務修改并提交了。

例如事務 T1 在讀取某一數據,而事務 T2 立馬修改了這個數據并且提交事務給數據庫,事務 T1 再次讀取該數據就得到了不同的結果,發送了不可重復讀。

不可重復讀和臟讀的區別是,臟讀是某一事務讀取了另一個事務未提交的臟數據,而不可重復讀則是讀取了前一事務提交的數據。

在某些情況下,不可重復讀并不是問題,比如我們多次查詢某個數據當然以***查詢得到的結果為主。但在另一些情況下就有可能發生問題,例如對于同一個數據 A 和 B 依次查詢就可能不同,A 和 B 就可能打起來了……

3 虛讀 (幻讀)

幻讀是事務非獨立執行時發生的一種現象。例如事務 T1 對一個表中所有的行的某個數據項做了從 “1” 修改為 “2” 的操作,這時事務 T2 又對這個表中插入了一行數據項,而這個數據項的數值還是為 “1” 并且提交給數據庫。而操作事務 T1 的用戶如果再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務 T2 中添加的,就好像產生幻覺一樣,這就是發生了幻讀。

幻讀和不可重復讀都是讀取了另一條已經提交的事務(這點就臟讀不同),所不同的是不可重復讀查詢的都是同一個數據項,而幻讀針對的是一批數據整體(比如數據的個數)。 

現在來看看 MySQL 數據庫為我們提供的四種隔離級別:

① Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發生。

② Repeatable read (可重復讀):可避免臟讀、不可重復讀的發生。

③ Read committed (讀已提交):可避免臟讀的發生。

④ Read uncommitted (讀未提交):***級別,任何情況都無法保證。 

以上四種隔離級別***的是 Serializable 級別,***的是 Read uncommitted 級別,當然級別越高,執行效率就越低。像 Serializable 這樣的級別,就是以鎖表的方式 (類似于 Java 多線程中的鎖) 使得其他的線程只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。在 MySQL 數據庫中默認的隔離級別為 Repeatable read (可重復讀)。

在 MySQL 數據庫中,支持上面四種隔離級別,默認的為 Repeatable read (可重復讀);而在 Oracle 數據庫中,只支持 Serializable (串行化) 級別和 Read committed (讀已提交) 這兩種級別,其中默認的為 Read committed 級別。

在 MySQL 數據庫中查看當前事務的隔離級別: 

  1. select @@tx_isolation; 

在 MySQL 數據庫中設置事務的隔離 級別: 

  1. set  [glogal | session]  transaction isolation level 隔離級別名稱;  
  2. set tx_isolation=’隔離級別名稱;’ 

例 1:查看當前事務的隔離級別:

例 2:將事務的隔離級別設置為 Read uncommitted 級別:

或:

記住:設置數據庫的隔離級別一定要是在開啟事務之前!

如果是使用 JDBC 對數據庫的事務設置隔離級別的話,也應該是在調用 Connection 對象的 setAutoCommit(false) 方法之前。調用 Connection 對象的 setTransactionIsolation(level) 即可設置當前鏈接的隔離級別,至于參數 level,可以使用 Connection 對象的字段:

在 JDBC 中設置隔離級別的部分代碼:

后記

 

隔離級別的設置只對當前鏈接有效。對于使用 MySQL 命令窗口而言,一個窗口就相當于一個鏈接,當前窗口設置的隔離級別只對當前窗口中的事務有效;對于 JDBC 操作數據庫來說,一個 Connection 對象相當于一個鏈接,而對于 Connection 對象設置的隔離級別只對該 Connection 對象有效,與其他鏈接 Connection 對象無關。 

責任編輯:龐桂玉 來源: ITPUB
相關推薦

2020-09-21 18:44:35

MySQL

2023-10-13 07:54:49

數據庫MySQL

2023-10-11 08:09:53

事務隔離級別

2020-04-07 09:21:45

MySQL數據庫SQL

2020-03-05 09:33:15

數據庫事務隔離事務

2018-07-20 11:10:21

數據庫事務隔離性

2018-10-17 09:55:06

數據庫隔離級別MySQL

2018-12-19 16:46:38

MySQL事務隔離數據庫

2010-11-19 16:13:06

oracle事務隔離級

2009-06-29 17:54:47

Spring事務隔離

2010-09-08 15:55:20

SQL事務特性

2017-08-09 14:34:12

MysqlJavaPython

2018-01-03 08:52:27

MySQL數據庫級別

2023-06-01 07:37:48

級別事務調度

2018-09-06 14:53:39

數據庫事務隔離隔離級別

2025-02-08 12:05:44

MySQLMyISAMInnoDB

2021-07-26 10:28:13

MySQL事務隔離

2024-04-26 09:17:20

MySQL事務隔離

2021-08-04 13:19:42

MySQL 事務隔離

2021-08-30 20:12:11

MySQL事務隔離
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品一区二区三区蜜桃久 | 羞羞网站在线免费观看 | 999久久久免费精品国产 | 亚洲成人综合在线 | 欧美精品一区二区三区四区五区 | 中文字幕国 | 日日操夜夜操天天操 | 国产精品久久久久久久久久久久久 | 婷婷久久网 | 91精品国产综合久久久久久丝袜 | 五月婷婷激情 | 亚洲欧美在线观看 | 国产精品亚洲一区二区三区在线 | 中文字幕免费视频 | 国产免费一区二区三区 | 欧美日韩久久精品 | 国产亚洲精品精品国产亚洲综合 | 天天躁日日躁狠狠很躁 | 福利国产 | 国产亚洲人成a在线v网站 | 免费看大片bbbb欧美 | 国产永久免费 | 成人av免费在线观看 | 黄色在线观看 | 伊人狠狠 | 在线永久看片免费的视频 | 免费看爱爱视频 | 91资源在线| 九九久久在线看 | 99爱国产 | 青青久久久| 日日日操 | 中文字幕视频在线看5 | 精品国产综合 | 久久久成人精品 | 国产精品久久久亚洲 | 精品一区二区三区在线观看国产 | 日韩一区二区福利视频 | 亚洲视频国产 | 99国产精品久久久 | 在线国产小视频 |