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

溫馨提示×

溫馨提示×

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

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

MySQL基礎——事務隔離級別

發布時間:2020-06-30 10:37:07 來源:網絡 閱讀:601 作者:一個笨小孩 欄目:數據庫

事務是DBMS得執行單位。它由有限得數據庫操作序列組成得。但不是任意得數據庫操作序列都能成為事務。一般來說,事務是必須滿足4個條件(ACID)

 ①:原子性(Autmic):事務在執行性,要做到“要么不做,要么全做!”,就是說不允許事務部分得執行。即使因為故障而使事務不能完成,在rollback時也要消除對數據庫得影響!

 ②:一致性(Consistency):事務操作之后,數據庫所處的狀態和業務規則是一致的;比如a,b賬戶相互轉賬之后,總金額不變!

 ③:隔離性(Isolation):如果多個事務并發執行,應像各個事務獨立執行一樣!

 ④:持久性(Durability):事務提交后被持久化到數據庫.


1、MYSQL的事務處理主要有兩種方法。

①:用BEGIN,ROLLBACK,COMMIT來實現

   開始:START TRANSACTION或BEGIN語句可以開始一項新的事務

   提交:COMMIT可以提交當前事務,是變更成為永久變更

   回滾:ROLLBACK可以回滾當前事務,取消其變更


②:直接用set來改變mysql的自動提交模式

    MYSQL默認是自動提交的,也就是你提交一個QUERY,它就直接執行!


2、事務的隔離級別:

   SQL標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的并發處理,并擁有更低的系統開銷。


①:Read Uncommitted(讀取未提交內容)

  在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少。讀取未提交的數據,也被稱之為臟讀(Dirty Read)。


②:Read Committed(讀取提交內容)

  這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別 也支持所謂的不可重復讀(Nonrepeatable Read),因為同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結果。


③:Repeatable Read(可重讀)

  這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在并發讀取數據時,會看到同樣的數據行。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。


④:Serializable(可串行化) 

  這是最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。


---注意:這四種隔離級別采取不同的鎖類型來實現,若讀取的是同一個數據的話,就容易發生問題。例如:


    ①:臟讀(Drity Read):某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由于某些原因,前一個RollBack了操作,則后一個事務所讀取的數據就會是不正確的。


    ②:不可重復讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數據。


    ③:幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾列(Row)數據,而另一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。  SQL標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的并發處理,并擁有更低的系統開銷。


3、修改MySQL的默認事務隔離級別:

   -----注意:MySQL默認的事務隔離級別: REPEATABLE-READ(可重讀)


①:修改事務隔離級別的語法:

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


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


②:用下列語句查詢全局和會話事務隔離級別:


SELECT @@global.tx_isolation; 

SELECT @@session.tx_isolation; 

SELECT @@tx_isolation; 


③:設置事務隔離級別:

-----在my.cnf配置文件修改:

  [mysqld]

 transaction-isolation = READ-COMMITTED


-----使用命令修改:

mysql> set global transaction isolation level read committed;

mysql> set session transaction isolation level read committed;


start transaction; //打開事務 


擴展知識:

“兩條不同的插入語句導致的死鎖:”

如果沒有特別的需求,可以設置MySQL的默認隔離級別設置為read-committed級別,這樣可以避免很多不必要的問題;也是解決死鎖的一種方法;


向AI問一下細節

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

AI

崇义县| 句容市| 宝应县| 广水市| 庆阳市| 明星| 宁津县| 辰溪县| 枝江市| 寿阳县| 青铜峡市| 高密市| 多伦县| 扶沟县| 河西区| 恩平市| 永寿县| 弥勒县| 眉山市| 宁阳县| 深圳市| 普兰县| 江源县| 富阳市| 惠安县| 修水县| 天台县| 望江县| 永清县| 舟曲县| 思南县| 洪湖市| 阜新市| 林芝县| 青岛市| 马边| 冷水江市| 文化| 城口县| 延吉市| 冕宁县|