關(guān)于事物級別的定義
1.read uncommitted (未提交讀)
可以看到未提交的數(shù)據(jù)(臟讀)旨怠,舉個例子:別人說的話你都相信了捂掰,但是可能他只是說說,并不實(shí)際做想括。
2.read committed (提交讀)
讀取提交的數(shù)據(jù)陷谱。但是,可能多次讀取的數(shù)據(jù)結(jié)果不一致(不可重復(fù)讀瑟蜈,幻讀)烟逊。用讀寫的觀點(diǎn)就是:讀取的行數(shù)據(jù),可以寫铺根。
3.repeatable read(重復(fù)讀MySQL默認(rèn)隔離級別)
可以重復(fù)讀取宪躯,但有幻讀。讀寫觀點(diǎn):讀取的數(shù)據(jù)行不可寫夷都,但是可以往表中新增數(shù)據(jù)眷唉。在MySQL中,其他事務(wù)新增的數(shù)據(jù)囤官,看不到,不會產(chǎn)生幻讀蛤虐。采用多版本并發(fā)控制(MVCC)機(jī)制解決幻讀問題党饮。
4.serializable(串行化)
可讀,不可寫驳庭。像java中的鎖刑顺,寫數(shù)據(jù)必須等待另一個事務(wù)結(jié)束氯窍。
關(guān)于Mysql的鎖機(jī)制:
1.表級鎖:
表級別的鎖定是MySQL各存儲引擎中最大粒度的鎖定機(jī)制。該鎖定機(jī)制最大的特點(diǎn)是實(shí)現(xiàn)邏輯簡單蹲堂,帶來的系統(tǒng)負(fù)面影響最小狼讨。所以獲取鎖和釋放鎖的速度很快。由于表級鎖一次會將整個表鎖定柒竞,所以可以很好的避免死鎖問題政供。?
當(dāng)然,鎖定顆粒度大所帶來最大的負(fù)面影響就是出現(xiàn)鎖定資源爭用的概率也會最高朽基,致使并大度較低布隔。
2.頁級鎖:
頁級鎖定的特點(diǎn)是鎖定顆粒度介于行級鎖定與表級鎖之間,所以獲取鎖定所需要的資源開銷稼虎,以及所能提供的并發(fā)處理能力也同樣是介于上面二者之間衅檀。另外,頁級鎖定和行級鎖定一樣霎俩,會發(fā)生死鎖哀军。?
在MySQL數(shù)據(jù)庫中,使用表級鎖定的主要是MyISAM打却,Memory排苍,CSV等一些非事務(wù)性存儲引擎,而使用行級鎖定的主要是Innodb存儲引擎和NDBCluster存儲引擎学密,頁級鎖定主要是BerkeleyDB存儲引擎的鎖定方式淘衙。
3.行級鎖
行級鎖定是目前各大數(shù)據(jù)庫管理軟件所實(shí)現(xiàn)的鎖定顆粒度最小的,所以發(fā)生鎖定資源爭用的概率也最小,能夠給予應(yīng)用程序盡可能大的并發(fā)處理能力而提高一些需要高并發(fā)應(yīng)用系統(tǒng)的整體性能腻暮。?
但是由于鎖定資源的顆粒度很小彤守,所以每次獲取鎖和釋放鎖消耗的資源也更多,帶來的消耗自然也就更大了哭靖。此外具垫,行級鎖定也最容易發(fā)生死鎖。
總的來說试幽,Innodb的鎖定機(jī)制和Oracle數(shù)據(jù)庫有不少相似之處筝蚕。Innodb的行級鎖定同樣分為兩種類型,共享鎖和排他鎖铺坞,而在鎖定機(jī)制的實(shí)現(xiàn)過程中為了讓行級鎖定和表級鎖定共存起宽,Innodb也同樣使用了意向鎖(表級鎖定)的概念,也就有了意向共享鎖和意向排他鎖這兩種济榨。
當(dāng)對某個資源加鎖時坯沪,如果?
- 有共享鎖,可以再加一個共享鎖擒滑,不過不能加排他鎖腐晾。 這個很好理解叉弦,就是多個事物只能讀數(shù)據(jù),不能同時改數(shù)據(jù)了藻糖。Mysql innodb 默認(rèn)對select 是不加鎖的淹冰,如果想加共享鎖,則需要 select * from table?lock in share mode.
- 有排它鎖巨柒,就在表上添加意向共享鎖或意向排他鎖樱拴。 而對于排他鎖并不是對數(shù)據(jù)加鎖后,其事物不能讀或者改數(shù)據(jù)潘拱,而是不能對其加其他鎖疹鳄。Mysql中innodb的insert update delete是默認(rèn)加排他鎖的。如果想對查詢語句加排他鎖可以:? select * from table for update;
意向共享鎖可以同時并存多個芦岂,但是意向排他鎖同時只能有一個存在瘪弓。所以,可以說Innodb的鎖定模式實(shí)際上可以分為四種:共享鎖(S)禽最,排他鎖(X)腺怯,意向共享鎖(IS)和意向排他鎖(IX)