當(dāng)前位置:
首頁(yè) >
数据库---事务的隔离级别
發(fā)布時(shí)間:2024/7/23
29
豆豆
生活随笔
收集整理的這篇文章主要介紹了
数据库---事务的隔离级别
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
首先,我們下面說(shuō)的數(shù)據(jù)庫(kù)事務(wù),都是使用INNODB引擎的結(jié)果。
MYISAM是沒(méi)有事務(wù)的,也就沒(méi)有下面這些說(shuō)法。
1.數(shù)據(jù)庫(kù)事務(wù)的四大特性:
了解上面的數(shù)據(jù)庫(kù)事務(wù)四大特性后,我們就知道,數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別有4個(gè),由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable。
2.這四個(gè)隔離級(jí)別,分別可以解決下面這幾類問(wèn)題。
| Read uncommitted | 會(huì)出現(xiàn) | 會(huì)出現(xiàn) | 會(huì)出現(xiàn) |
| Read committed | 不會(huì)出現(xiàn) | 會(huì)出現(xiàn) | 會(huì)出現(xiàn) |
| Repeatable read | 不會(huì)出現(xiàn) | 不會(huì)出現(xiàn) | 會(huì)出現(xiàn) |
| Serializable | 不會(huì)出現(xiàn) | 不會(huì)出現(xiàn) | 不會(huì)出現(xiàn) |
3.常見(jiàn)的數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別:
4.解釋下常見(jiàn)的這幾類問(wèn)題
事務(wù)一對(duì)一條數(shù)據(jù)做了修改,但并未提交或者回滾的時(shí)候,事務(wù)二讀到了這個(gè)事務(wù)一已經(jīng)修改的數(shù)據(jù),但是由于這條數(shù)據(jù)是否真的要修改,事務(wù)一還并沒(méi)有確定,事務(wù)二就讀到了,所以我們可以說(shuō),事務(wù)二讀到了臟數(shù)據(jù),這種問(wèn)題就叫臟讀。
舉個(gè)例子,數(shù)據(jù)庫(kù)中有一條數(shù)據(jù)a=1,此時(shí)事務(wù)一做了修改:a=2,但并未提交
如果此時(shí)事務(wù)的隔離級(jí)別是Read uncommitted的話,那么此時(shí)事務(wù)二再讀a的值,就會(huì)讀到2,那么如果此時(shí)事務(wù)一又回滾了,那么數(shù)據(jù)庫(kù)真實(shí)的a的值還是1,但對(duì)于事務(wù)二來(lái)說(shuō),已經(jīng)錯(cuò)了,因?yàn)槭聞?wù)二讀到了2。
如果此時(shí)事務(wù)的隔離級(jí)別是Read committed或Repeatable read或Serializable,那么事務(wù)二讀到的a的值,就還是1。
一個(gè)事務(wù)重復(fù)兩次讀取一條數(shù)據(jù)的中間,另一個(gè)事務(wù)對(duì)這條數(shù)據(jù)做了修改,導(dǎo)致第一個(gè)事務(wù)的兩次讀的結(jié)果出現(xiàn)不同。
舉個(gè)例子,小李買(mǎi)東西的時(shí)候,刷銀行卡,一開(kāi)始系統(tǒng)查到賬戶余額200元,于是準(zhǔn)備開(kāi)始執(zhí)行扣款,于此同時(shí),小李老婆剛好在另外一個(gè)地方將這200元取走了,從而導(dǎo)致小李這邊扣款失敗,這就是不可重復(fù)讀的問(wèn)題。
注意:
mysql的默認(rèn)隔離級(jí)別下,是不會(huì)出現(xiàn)這種問(wèn)題的;
oracle的默認(rèn)隔離級(jí)別下,會(huì)出現(xiàn)這種問(wèn)題。
一個(gè)事務(wù)以相同的條件查詢以前檢索過(guò)的數(shù)據(jù),一般指查詢數(shù)據(jù)條數(shù)的時(shí)候,由于其他事務(wù)對(duì)某些數(shù)據(jù)做了增或者刪,導(dǎo)致第一個(gè)事務(wù)查出來(lái)的總條數(shù)和以前的結(jié)果不同了,這叫幻讀。
其實(shí)一般情況的業(yè)務(wù)下,幻讀是可以接受的,所以我個(gè)人認(rèn)為幻讀不算什么問(wèn)題吧。
而且mysql和oracle的默認(rèn)隔離級(jí)別下,也都會(huì)出現(xiàn)這個(gè)幻讀的現(xiàn)象。
如果非要解決幻讀,無(wú)非就是加個(gè)表級(jí)別的鎖,這樣效率太差了,而且一般都沒(méi)必要。
5.mysql 對(duì)隔離級(jí)別的查詢和設(shè)置
查詢隔離級(jí)別:
SHOW VARIABLES LIKE ‘tx_isolation’;
設(shè)置隔離級(jí)別:
SET GLOBAL tx_isolation=‘REPEATABLE-READ’;
SET SESSION tx_isolation=‘SERIALIZABLE’;
GLOBAL是全局,SESSION是當(dāng)前會(huì)話,如果沒(méi)有指定,默認(rèn)是SESSION。
總結(jié)
以上是生活随笔為你收集整理的数据库---事务的隔离级别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 王者荣耀服务器维护bug,8月23日王者
- 下一篇: 数据库---mysql的索引和引擎