中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MYSQL事務以及隔離級的概念

發布時間:2021-09-15 14:57:17 來源:億速云 閱讀:155 作者:chen 欄目:數據庫

這篇文章主要介紹“MYSQL事務以及隔離級的概念”,在日常操作中,相信很多人在MYSQL事務以及隔離級的概念問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MYSQL事務以及隔離級的概念”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

事務的概念
  事務是一組原子性的SQL查詢語句,也可以被看做一個工作單元。如果數據庫引擎能夠成功地對數據庫應用所有的查詢語 句,它就會執行所有查詢,如果任何一條查詢語句因為崩潰或其他原因而無法執行,那么所有的語句就都不會執行。也就是說,事務內的語句要么全部執行,要么一 句也不執行。
  例:將b表中符合條件的記錄搬移到a表中(相似語句已在命令提示行中測試)

雙擊代碼全選
1 2 3 4 5start transaction;//用start transaction語句開始一個事務 insert into a select from b where ...;//將b表中符合條件的行記錄插入a表 delete from b where ...;//將b表中符合條件的行記錄刪除 commit; /rollback; //commit語句提交整個事務,永久地修改數據,rollback語句回滾整個事務,取消已做的修改 //如果插入操作失敗,那么刪除操作將不執行

  ACID測試

  ACID:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability)。一個有效的事務處理系統必須滿足相關標準。
  a.原子性:一個事務必須被視為一個單獨的內部“不可分”的工作單元,以確保整個事務要么全部執行,要么全部回滾。當一個事務具有原子性時,該事務絕對不會被部分執行,要么完全執行,要么根本不執行。
  b.一致性:數據庫總是從一種一致性狀態轉換到另一種一致性狀態。在上述例子中,一致性確保了,即使插入或者刪除操作失敗了,數據庫也不會多出或者丟失記錄。因為最終事務根本沒有被提交,任何事務處理過程中所做的數據改變,也不會影響到數據庫的內容。
  c.隔離性:某個事務的結果只有在完成之后才對其他事務可見。在上述例子中,當數據庫執行完insert語句,還未執行delete語句時,如果此時另一個客戶端對數據庫的訪問也同時運行,它將仍視符合條件的記錄在b表中。
  d.持久性:一旦一個事務提交,事務所做的數據改變將是永久的。
   這種事務處理中的額外安全措施,導致數據庫服務器要完成更多的額外工作。通常,一個支持ACID特性的數據庫,相對于不支持這種特性的數據庫,需要更強 的CPU處理能力,更大的內存和更多的磁盤空間。這正是選用MYSQL存儲引擎架構的有利之處。用戶可以根據應用是否需要事務處理,選擇相應的存儲引擎。 如果對于某些類型的數據查詢,用戶不需要真正的事務處理,他可以選擇一個非事務處理型的存儲引擎來實現查詢,以獲得更高的處理性能。(我們的數據庫選擇的 存儲引擎是innoDB,支持事務處理,而mysql默認的存儲引擎是MyISAM引擎,不支持事務)
  隔離級
  SQL標準定義了4類隔離級,包括了一些具體規則,用來限定事務內外的哪些改變時可見的,哪些是不可見的。低級別的隔離級一般支持更高的并發處理,并擁有更低的系統開銷。
  READ UNCOMMITTED(讀取未提交內容)
   在READ UNCOMMITTED隔離級,所有事務都可以“看到”未提交事務的執行結果。在這種級別上,可能會產生很多問題。本隔離級很少用于實際應用,因為它的性 能也不比其他級別好多少,而別的級別還有其他更多的優點。讀取未提交數據,也被稱之為“臟讀(Dirty Read)”
  READ COMMITTED(讀取提交內容)
   大多數數據庫系統的默認隔離級是READ COMMITTED(但這不是MYSQL默認的)。它滿足了隔離的早先簡單定義:一個事務在開始時,只能“看見”已經提交事務所做的改變,一個事務從開始 到提交前,所做的任何數據改變都是不可見的,除非已經提交。這種隔離級別也支持所謂的“不可重復讀(Nonrepeatable Read)”。這意味著用戶運行同一語句兩次,看到的結果是不同的。
  REPEATABLE READ(可重讀)
   REPEATABLE READ 隔離級解決了READ UNCOMMITTED隔離級導致的問題。它確保同一事務的多個實例在并發讀取數據時,會“看到相同的”數據行。不過理論上,這會導致另一個棘手問題:幻 讀(Phantom Read)。簡單來說,幻讀指當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,另一個事務又在該范圍內 插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影”行。InnoDB和Falcon存儲引擎通過多版本并發控制機制解決了幻讀問題。 REPEATABLE READ 是MYSQL的默認事務隔離級。InnoDB和Falcon存儲引擎都遵循這種設置。
  SERIALIZABLE(可串行化)
  SERIALIZABLE是最高級別的隔離級,它通過強制事務排斥,使之不可能相互沖突,從而解決幻讀問題。簡言之,SERIALIZABLE是在每個讀的數據行上加鎖。在這個級別,可能導致大量的超時現象和鎖競爭現象。很少看到有用戶選擇這種隔離級。
  注:不可重復讀與幻讀:不可重復讀的重點是修改(同樣的查詢條件,你讀取過的數據,再次讀取出來發現值不一樣了);幻讀的重點在于新增或者刪除(同樣的查詢條件,第1次和第2次讀出來的記錄數不一樣)
  查看InnoDB系統級別的事務隔離級別:

雙擊代碼全選
1mysql> SELECT @@global.tx_isolation;

  查看InnoDB會話級別的事務隔離級別:

雙擊代碼全選
1mysql> SELECT @@tx_isolation;

  MySQL中的事務

  AUTOCOMMIT(自動提交)
  MySQL默認操作模式是AUTOCOMMIT模式。這意味著除非顯示地開始一個事務,否則它將把每個查詢視為一個單獨事務自動執行。在當前連接中,可以通過變量設置,啟用和禁用AUTOCOMMIT模式。

雙擊代碼全選
1 2mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT'; //高版本的mysql支持  mysql> select @@autocommit; //mysql5.0支持

  如果設置AUTOCOMMIT=0,用戶將一直處于某個事務中,直到用戶執行一條COMMIT或ROLLBACK語句,之后,MYSQL將立即開始一個新事務。

  在事務中混合使用存儲引擎
  在一個事務中,如果混合使用事務性表和非事務性表,假如事務處理一切順利,那么結果也會正常。但是,如果事務須回滾,那么在非事務性表上做的修改將無法取消。這將導致數據庫處于數據不一致的狀態,在這種狀態下,很難對數據進行恢復,并且事務會變得懸而未決。
  隱式和顯式鎖定
   InnoDB使用二相鎖定協議(Two-Phase Locking Protocol兩段鎖協議)。一個事務在執行過程中的任何時候,都可以獲得鎖,但只有在執行COMMIT或ROLLBACK語句后,才可以釋放這些鎖。 它會同時釋放掉所有鎖。以上描述的鎖定機制都是隱式鎖定。InnoDB會根據用戶的隔離級別,自動處理鎖定。不過InnoDB也支持顯示鎖定。

到此,關于“MYSQL事務以及隔離級的概念”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汝城县| 邹城市| 介休市| 揭阳市| 沙雅县| 黎平县| 和林格尔县| 乐山市| 进贤县| 宁城县| 苍溪县| 东莞市| 东乌珠穆沁旗| 庆安县| 石阡县| 翁源县| 潮安县| 丹江口市| 鄂托克旗| 措勤县| 宁河县| 利津县| 桃园市| 彰武县| 于都县| 鹿邑县| 崇左市| 那曲县| 河南省| 顺昌县| 锡林郭勒盟| 松江区| 兴隆县| 洪江市| 江都市| 九龙城区| 小金县| 北安市| 岫岩| 武汉市| 九龙县|