日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(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ù)的四大特性:

  • 原子性:事務(wù)包含的所有數(shù)據(jù)庫(kù)操作要么全部成功,要不全部失敗回滾
  • 一致性:一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。拿轉(zhuǎn)賬來(lái)說(shuō),假設(shè)用戶A和用戶B兩者的錢(qián)加起來(lái)一共是100塊,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢(qián)相加起來(lái)應(yīng)該還得是100塊,這就是事務(wù)的一致性。
  • 隔離性:一個(gè)事務(wù)未提交的業(yè)務(wù)結(jié)果是否對(duì)于其它事務(wù)可見(jiàn)。級(jí)別一般有:read_uncommit,read_commit,read_repeatable,Serializable。
  • 持久性:一個(gè)事務(wù)一旦被提交了,那么對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫(kù)系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作。
  • 了解上面的數(shù)據(jù)庫(kù)事務(wù)四大特性后,我們就知道,數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別有4個(gè),由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable。

    2.這四個(gè)隔離級(jí)別,分別可以解決下面這幾類問(wèn)題。

    設(shè)置事務(wù)隔離級(jí)別為臟讀不可重復(fù)讀幻讀
    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)
  • Serializable就是強(qiáng)制串行化,相當(dāng)于讓數(shù)據(jù)庫(kù)只能單線程訪問(wèn),所以上面這些問(wèn)題都不會(huì)出現(xiàn),但效率實(shí)在太低,所以一般不會(huì)考慮將數(shù)據(jù)庫(kù)隔離級(jí)別設(shè)置成Serializable
  • Read uncommitted又對(duì)事務(wù)放的太寬了,如果將數(shù)據(jù)庫(kù)的隔離級(jí)別設(shè)置成Read uncommitted,那么各個(gè)事務(wù)之間就會(huì)各種亂搞亂讀,那么基本上程序就會(huì)出現(xiàn)各種大bug,所以一般也不會(huì)將數(shù)據(jù)庫(kù)隔離級(jí)別設(shè)置成Read uncommitted
  • 3.常見(jiàn)的數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別:

  • oracle的默認(rèn)隔離級(jí)別Read committed,所以默認(rèn)下可能會(huì)出現(xiàn)不可重復(fù)讀和幻讀的問(wèn)題。
  • mysql的默認(rèn)隔離級(jí)別是Repeatable read,所以默認(rèn)下可能出現(xiàn)幻讀讀問(wèn)題。
  • 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。
  • 不可重復(fù)讀
    一個(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。