【綜合】事務的處理及隔離級別
原文地址:http://blog.csdn.net/qiaoge134/article/details/20031949
事務的隔離級別:
先說說 (通俗說)
1. 臟讀:是一個事務讀取了 其他事務沒有提交的數據。
2.不可重復度:就是第一次讀和第二次讀,兩次讀到的 數據不一致,原因是:在此期間有其他的事務修改了數據。
3.幻讀:就是第一次讀和第二次讀,兩次讀到的 數據不一致,
原因是:在此期間有事務插入了新的數據(區別於不可重復讀:不可重復讀是 對於修改操作而言,幻讀對插入造作而言)
事務的隔離級別有:read-uncommite(讀沒提交),read-commite(讀已提交),none-repeatedRead(不可重復度),serializable(序列化,順序化)
一般的 數據庫都不存在 第一種read-uncommite的情況。
一般數據庫都有自己默認的事務隔離級別;一般情況是 read-commite,這個解決了臟讀的問題,並且效率高 。
人們為了讓 數據庫的效率高並且可以隔離級別高,就出來了 “樂觀鎖”和“悲觀鎖”的思想。
簡單理解:樂觀鎖:當一個事務讀取數據後,要進行操作,在操作前 為數據加一個版本信息(version),當在操作期間有其他事物對改數據進行了操作,那麽版本信息就會變
化,這樣當改事務執行結束後判斷一下版本信息,如果沒變,那麽提交事務,如果改變了,那麽重復執行上述操作---這就是樂觀鎖的思想,很多地方用到這個思想,比如安卓的
數據庫sqlite就又到了version。
悲觀鎖:是當一個事務對 數據進行操作的時候對數據加“鎖”,在此事務沒有提交之前,其他事務是不能操作該數據的,只有這個事務結束提交後,其他事物才能對它進行操作。
當然,很明顯,樂觀鎖的性能要優於悲觀鎖。。。
原文地址:http://blog.sina.com.cn/s/blog_4c197d420101awhc.html
關於MySQL的事務處理及隔離級別
事務是DBMS得執行單位。它由有限得數據庫操作序列組成得。但不是任意得數據庫操作序列都能成為事務。一般來說,事務是必須滿足4個條件(ACID) 原子性(Autmic):事務在執行性,要做到“要麽不做,要麽全做!”,就是說不允許事務部分得執行。即使因為故障而使事務不能完成,在rollback時也要消除對數據庫得影響! 一致性(Consistency)http://blog.csdn.net/endlu/article/details/51531397
Mysql事務隔離級別與鎖
數據庫的事務有幾種特性,例如一致性和隔離性,一般通過加鎖來實現。同時數據庫又是一個高並發的應用,如果加鎖過度或者不當將嚴重影響性能。數據庫提供了幾種隔離級別來供選擇,本文通過解析InnoDB的加鎖機制是如何實現幾種隔離級別,來更深刻的理解mysql的鎖。 兩階段鎖 首先,事務的所操作分為兩個階段:加鎖和解鎖,兩者不想交。因為事務開始時,並不知道會用到哪些數據,所以加鎖階段隨著事務的執行,可能一直在執行。事務結束時,一起將鎖釋放。註意:不相交!這是兩階段鎖的原則,但是有時為了效率也會違反,後面再詳述。這種方法由於加鎖不是一次獲取全部的鎖,可能出現死鎖,但是事務的並發調度是串行化的。 四種隔離級別:- Read Uncommit:未提交讀。允許臟讀。
- Read Commit : 提交讀。只能讀到其他事務已提交的內容。允許不重復讀。
- Repeated Read : 可重復讀。同一個事務內的查詢與事務開始時是一致的。允許幻讀。Mysql默認的級別。
- Serializable : 串行化的讀。每次讀都要獲取表級鎖,讀寫互相阻塞。
- select時,讀取版本號<=當前事務號並且刪除版本號為空或>當前事務號的行。
- insert,保存事務號為當前事務號。
- delete,保存當前事務號為刪除版本號。
- update,創建新的一行,保存事務號為當前事務號。
- 快照讀:
- select * from test where ... ;
- 當前讀:
- select * from test where ... in share mode ;
- select * from test where ... for update ;
- insert
- update
- delete
- A:select * from test where age = 10; 返回一條記錄
- A:update test set name = ‘a’ where age = 10;
- B:insert into test values(10,‘b’);
- B:commit;
- A:select * from test where age = 10; 返回兩條記錄
- A:commit ;
- A:select * from test where age = 10; 返回一條記錄
- B:insert into test values(10,‘b’);
- B:commit;
- A:update test set name = ‘qwe’where age = 10;
- A:select * from test where age = 10; 返回兩條記錄
【綜合】事務的處理及隔離級別