<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          數(shù)據(jù)庫(kù)事務(wù) ACID屬性、數(shù)據(jù)庫(kù)并發(fā)問(wèn)題和四種隔離級(jí)別

          共 3434字,需瀏覽 7分鐘

           ·

          2021-03-15 09:27

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

            作者 |  wangruijie

          來(lái)源 |  urlify.cn/u2euu2

          76套java從入門到精通實(shí)戰(zhàn)課程分享

          數(shù)據(jù)庫(kù)事務(wù)

          數(shù)據(jù)庫(kù)事務(wù)是一組邏輯操作單元,使數(shù)據(jù)從一種狀態(tài)變換到另一種狀態(tài)

          一組邏輯操作單元;一個(gè)或多個(gè)DML操作

          事務(wù)處理原則

          保證所有事務(wù)都作為一個(gè)工作單元來(lái)執(zhí)行,即使出現(xiàn)故障,都不能改變這種執(zhí)行方式。
          一個(gè)事務(wù)執(zhí)行多次操作時(shí),要么所有事務(wù)都被提交,則永久保存;要么放棄所有修改,整個(gè)事務(wù)回滾到最初狀態(tài)

          數(shù)據(jù)一旦提交,則不可回滾

          那些操作會(huì)導(dǎo)致自動(dòng)提交

          DDL操作一旦執(zhí)行,都會(huì)自動(dòng)提交
          DML默認(rèn)情況下,一旦執(zhí)行,就會(huì)自動(dòng)提交
          可以通過(guò)set autocommit = false的方式取消DML自動(dòng)提交
          默認(rèn)在關(guān)閉連接時(shí),會(huì)自動(dòng)提交數(shù)據(jù)

          ACID屬性

          事務(wù)必須滿足四個(gè)屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),即ACID四種屬性。

          原子性

          一個(gè)事務(wù)是一個(gè)不可分割的整體,為了保證事務(wù)的總體目標(biāo),事務(wù)必須具有原子性,即當(dāng)數(shù)據(jù)修改時(shí),要么全都執(zhí)行,要么全都不執(zhí)行。即,不允許事務(wù)部分地完成,避免了只執(zhí)行這些操作的一部分而帶來(lái)的錯(cuò)誤。

          一致性

          一個(gè)事務(wù)在執(zhí)行之前和執(zhí)行之后,數(shù)據(jù)庫(kù)數(shù)據(jù)必須保持一致性。數(shù)據(jù)庫(kù)的一致性狀態(tài)應(yīng)該滿足模式鎖指定的約束條件,那么在完整執(zhí)行該事務(wù)后,數(shù)據(jù)庫(kù)仍然處于一致性狀態(tài)。

          例如:銀行轉(zhuǎn)賬,轉(zhuǎn)賬前后兩個(gè)賬戶金額之和應(yīng)保持不變。

          隔離性

          由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離。事務(wù)查看數(shù)據(jù)庫(kù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會(huì)查看中間狀態(tài)的數(shù)據(jù)。

          例如:對(duì)任何一對(duì)事務(wù)T1和T2,對(duì)T1而言,T2要么在T1開(kāi)始之前已經(jīng)結(jié)束,要么在T1完成之后再開(kāi)始執(zhí)行。

          持久性

          也被稱為永久性,事務(wù)完成以后,DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))保證它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的修改是永久性的,當(dāng)系統(tǒng)或介質(zhì)發(fā)生故障時(shí),該修改也永久保持。持久性一般通過(guò)數(shù)據(jù)庫(kù)備份與恢復(fù)來(lái)保證。

          • 注意    嚴(yán)格而言,數(shù)據(jù)庫(kù)事務(wù)屬性都是由數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)進(jìn)行保證的,在整個(gè)應(yīng)用程序的運(yùn)行過(guò)程中,應(yīng)用程序無(wú)須去考慮數(shù)據(jù)庫(kù)的ACID實(shí)現(xiàn)。

          一般情況下,通過(guò)執(zhí)行COMMIT(提交)或ROLLBACK(回滾)語(yǔ)句來(lái)終止事務(wù)。當(dāng)執(zhí)行COMMIT語(yǔ)句時(shí),自從事務(wù)啟動(dòng)以來(lái)對(duì)數(shù)據(jù)庫(kù)所做的一切更改就成為永久性的,即被寫入到磁盤,而當(dāng)執(zhí)行ROLLBACK語(yǔ)句時(shí),自從事務(wù)啟動(dòng)以來(lái)對(duì)數(shù)據(jù)庫(kù)所做的一切更改都會(huì)被撤銷,并且數(shù)據(jù)庫(kù)中內(nèi)容返回到事務(wù)開(kāi)始之前所處的狀態(tài)。無(wú)論什么情況,在事務(wù)完成時(shí),都能保證回到一致性狀態(tài)。

          數(shù)據(jù)庫(kù)并發(fā)問(wèn)題

          如果沒(méi)有鎖定且多個(gè)用戶同時(shí)訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),則當(dāng)他們的事務(wù)同時(shí)使用相同的數(shù)據(jù)時(shí)可能會(huì)發(fā)生問(wèn)題。由于并發(fā)操作帶來(lái)的數(shù)據(jù)不一致性包括:丟失數(shù)據(jù)更新、讀“臟”數(shù)據(jù)(臟讀)、不可重復(fù)讀。

          更新丟失

          • 兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù),一個(gè)事務(wù)對(duì)數(shù)據(jù)的更新把另一個(gè)事務(wù)對(duì)數(shù)據(jù)的更新覆蓋了。這是因?yàn)橄到y(tǒng)沒(méi)有執(zhí)行任何的鎖操作,因此并發(fā)并沒(méi)有被隔離開(kāi)來(lái)。

          臟讀

          • 一個(gè)事務(wù)讀取到了另一事務(wù)未提交的數(shù)據(jù)操作結(jié)果。這是相當(dāng)危險(xiǎn)的,因?yàn)楹芸赡芩械牟僮鞫急换貪L。

          不可重復(fù)讀

          • 不可重復(fù)讀(Non-repeatable Reads):一個(gè)事務(wù)對(duì)同一行數(shù)據(jù)重復(fù)讀取兩次,但是卻得到了不同的結(jié)果。

          包括以下情況:

          • 虛讀:事務(wù)T1讀取某一數(shù)據(jù)后,事務(wù)T2對(duì)其做了修改,當(dāng)事務(wù)T1再次讀取該數(shù)據(jù)時(shí)得到與前一次不同的值。

          • 幻讀:事務(wù)在操作過(guò)程中進(jìn)行兩次查詢,第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)或者缺少了第一次查詢中出現(xiàn)的數(shù)據(jù)。這是因?yàn)樵趦纱尾樵冞^(guò)程中有另外一個(gè)事務(wù)插入數(shù)據(jù)造成的。

          數(shù)據(jù)庫(kù)事務(wù)的四種隔離級(jí)別

          數(shù)據(jù)庫(kù)事務(wù)的隔離級(jí)別有4個(gè),由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個(gè)級(jí)別可以逐個(gè)解決臟讀 、不可重復(fù)讀 、幻讀這幾類問(wèn)題。
          不同的隔離級(jí)別對(duì)事務(wù)的處理不同。

          • 讀未提交數(shù)據(jù)(Read Uncommitted):只處理更新丟失。如果一個(gè)事務(wù)已經(jīng)開(kāi)始寫數(shù)據(jù),則不允許其他事務(wù)同時(shí)進(jìn)行寫操作,但允許其他事務(wù)讀此行數(shù)據(jù)。可通過(guò)“排他寫鎖”實(shí)現(xiàn)。

          • 讀已提交數(shù)據(jù)(Read Committed):處理更新丟失、臟讀。讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問(wèn)改行數(shù)據(jù),但是未提交的寫事務(wù)將會(huì)禁止其他事務(wù)訪問(wèn)改行??赏ㄟ^(guò)“瞬間共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。

          • 可重復(fù)讀?。≧epeatable Read):處理更新丟失、臟讀和不可重復(fù)讀取。讀取數(shù)據(jù)的事務(wù)將會(huì)禁止寫事務(wù),但允許讀事務(wù),寫事務(wù)則禁止任何其他事務(wù)??赏ㄟ^(guò)“共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。

          • 序列化(串行化)(Serializable):提供嚴(yán)格的事務(wù)隔離。要求失去序列化執(zhí)行,事務(wù)只能一個(gè)接一個(gè)地執(zhí)行,不能并發(fā)執(zhí)行。僅僅通過(guò)“行級(jí)鎖”是無(wú)法實(shí)現(xiàn)事務(wù)序列化的,必須通過(guò)其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作的事務(wù)訪問(wèn)到。

          隔離級(jí)別越高,越能保證數(shù)據(jù)的完整性和統(tǒng)一性,但是對(duì)并發(fā)性能的影響也越大。對(duì)于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫(kù)系統(tǒng)的隔離級(jí)別設(shè)為Read Committed。它能夠避免臟讀,而且具有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致不可重復(fù)讀、幻讀和第二類丟失更新這些并發(fā)問(wèn)題,在可能出現(xiàn)這類問(wèn)題的個(gè)別場(chǎng)合,可以由應(yīng)用程序采用悲觀鎖或樂(lè)觀鎖來(lái)控制。

          • Oracle 支持的 2 種事務(wù)隔離級(jí)別:READ COMMITED, SERIALIZABLE. Oracle 默認(rèn)的事務(wù)隔離級(jí)別為: READ COMMITED

          • Mysql 支持 4 中事務(wù)隔離級(jí)別. Mysql 默認(rèn)的事務(wù)隔離級(jí)別為: REPEATABLE READ

          事務(wù)隔離級(jí)別設(shè)置

          //查看當(dāng)前事物級(jí)別:
          SELECT @@tx_isolation;
          //設(shè)置mysql的隔離級(jí)別:
          //set session transaction isolation level 設(shè)置事務(wù)隔離級(jí)別

          //設(shè)置read uncommitted級(jí)別:
          set session transaction isolation level read uncommitted;

          //設(shè)置read committed級(jí)別:
          set session transaction isolation level read committed;

          //設(shè)置repeatable read級(jí)別:
          set session transaction isolation level repeatable read;

          //設(shè)置serializable級(jí)別:
          set session transaction isolation level serializable;

          Java代碼獲取和設(shè)置隔離級(jí)別(下文conn為Connection 對(duì)象,具體實(shí)現(xiàn)不做整理)

          //獲取數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別
          int transactionIsolation = conn.getTransactionIsolation();
          //設(shè)置數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別;事務(wù)隔離級(jí)別:TRANSACTION_READ_COMMITTED
          conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);





          鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

          ??????

          ??長(zhǎng)按上方微信二維碼 2 秒





          感謝點(diǎn)贊支持下哈 

          瀏覽 70
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人A一级毛片免费看视频 | 苍井空一区二区在线观看 | 欧美黄色视屏 | 影音先锋色五月 | 男人亚洲天堂 |