日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql事务所_mysql事务

發(fā)布時(shí)間:2023/12/10 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql事务所_mysql事务 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.事務(wù)的ACID屬性

事務(wù)(Database Transaction) ,是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。事務(wù)處理可以確保除非事務(wù)性單元內(nèi)的所有操作都成功完成,否則不會(huì)永久更新面向數(shù)據(jù)的資源。通過將一組相關(guān)操作組合為一個(gè)要么全部成功要么全部失敗的單元,可以簡化錯(cuò)誤恢復(fù)并使應(yīng)用程序更加可靠。一個(gè)邏輯工作單元要成為事務(wù),必須滿足所謂的ACID(原子性、一致性、隔離性和持久性)屬性。

原子性(atomic),事務(wù)必須是原子工作單元;對(duì)于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行

一致性(consistent),事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)。

隔離性(insulation),由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離。

持久性(Duration),事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的。

2.mysql更新丟失

a.第一類丟失更新(lost update): 在完全未隔離事務(wù)的情況下,兩個(gè)事物更新同一條數(shù)據(jù)資源,某一事物異常終止,回滾造成第一個(gè)完成的更新也同時(shí)丟失。

b.第二類丟失更新(second lost updates):是不可重復(fù)讀的特殊情況,如果兩個(gè)事務(wù)都讀取同一行,然后兩個(gè)都進(jìn)行寫操作,并提交,第一個(gè)事務(wù)所做的改變就會(huì)丟失。

c.臟讀(dirty read):如果第二個(gè)事務(wù)查詢到第一個(gè)事務(wù)還未提交的更新數(shù)據(jù),形成臟讀。

d.幻讀(phantom read):一個(gè)事務(wù)執(zhí)行兩次查詢,第二次結(jié)果集包含第一次中沒有或者某些行已被刪除,造成兩次結(jié)果不一致,只是另一個(gè)事務(wù)在這兩次查詢中間插入或者刪除了數(shù)據(jù)造成的。

e.不可重復(fù)讀(unrepeated read):一個(gè)事務(wù)兩次讀取同一行數(shù)據(jù),結(jié)果得到不同狀態(tài)結(jié)果,如中間正好另一個(gè)事務(wù)更新了該數(shù)據(jù),兩次結(jié)果相異,不可信任。

3.事務(wù)的四種隔離等級(jí),按照安全性由高到低分別為

a. Serializable 串行化

b. Repeatable Read 可重復(fù)讀

c. Read Commited 可讀已提交

d. Read Uncommited 可讀未提交

隔離級(jí)別臟讀不可重復(fù)讀幻讀第一類丟失更新第二類丟失更新

READ UNCOMMITED

允許

允許

允許

不允許

允許

READ COMMITTED

不允許

允許

允許

不允許

允許

REPEATABLE READ

不允許

不允許

允許

不允許

不允許

SERIALIZABLE

不允許

不允許

不允許

不允許

不允許

4.悲觀鎖和樂觀鎖

a.悲觀鎖:大多數(shù)情況下依靠數(shù)據(jù)庫的鎖機(jī)制實(shí)現(xiàn),以保證操作最大程度的獨(dú)占性。但隨之而來的就是數(shù)據(jù)庫性能的大量開銷,特別是對(duì)長事務(wù)而言,這樣的開銷往往無法承受。

b.樂觀鎖:為了避免悲觀鎖的性能問題,大多是基于數(shù)據(jù)版本(Version)記錄機(jī)制實(shí)現(xiàn)。何謂數(shù)據(jù)版本?即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí),在基于數(shù)據(jù)庫表的版本解決方案中,一般是通過為數(shù)據(jù)庫表增加一個(gè)"version"字段來實(shí)現(xiàn)。

樂觀鎖的工作原理:讀取出數(shù)據(jù)時(shí),將此版本號(hào)一同讀出,之后更新時(shí),對(duì)此版本號(hào)加一。此時(shí),將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫表對(duì)應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對(duì),如果提交的數(shù)據(jù)版本號(hào)大于數(shù)據(jù)庫表當(dāng)前版本號(hào),則予以更新,否則認(rèn)為是過期數(shù)據(jù)。

5.innodb事務(wù)特性

a.innodb能檢測到死鎖,可能返回錯(cuò)誤,也可能將持有最少行級(jí)排他鎖的事務(wù)進(jìn)行回滾

b.innodb存儲(chǔ)引擎在修改表數(shù)據(jù)時(shí),使用事務(wù)日志,用追加的方式保存修改記錄,將隨機(jī)IO方式改為了順序IO方式,提高處理速度、

c.事務(wù)默認(rèn)采用自動(dòng)提交,如果不是顯示開始一個(gè)事務(wù),則每個(gè)查詢都被當(dāng)做一個(gè)事務(wù)執(zhí)行提交操作

6.InnoDB的事務(wù)隔離等級(jí)以及如何解決幻讀:

innodb引擎默認(rèn)使用REPEATABLE READ(可重復(fù)讀)隔離級(jí)別。該隔離級(jí)別還是會(huì)產(chǎn)生幻讀問題。還

需要使用next-key locking技術(shù)啟動(dòng)事務(wù)來避免幻讀。

具體實(shí)現(xiàn)是:事務(wù)A針對(duì)非唯一索引查詢時(shí),會(huì)使用排它鎖 鎖住索引前后兩個(gè)范圍,其他事務(wù)無法在此范圍內(nèi)寫入數(shù)據(jù),這樣事務(wù)A多次查詢的記錄數(shù)都是一樣的

7.InnoDB存儲(chǔ)引擎MVCC的實(shí)現(xiàn)策略:

MVCC將數(shù)據(jù)庫的行鎖與行的多個(gè)版本結(jié)合起來,只需要很小的開銷,就可以實(shí)現(xiàn)非鎖定讀,從而大大提高數(shù)據(jù)庫系統(tǒng)的并發(fā)性能.

MVCC實(shí)現(xiàn)原理:MVCC保存某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)快照。一個(gè)事務(wù)內(nèi),看到的是同一個(gè)版本的快照,數(shù)據(jù)一致。不同事務(wù)在同一時(shí)間點(diǎn)看到的數(shù)據(jù)會(huì)不一致,因?yàn)樗麄兊玫降臄?shù)據(jù)版本不一樣。InnoDB在每行記錄存在額外的隱藏字段,其中一列存儲(chǔ)行被更新的版本號(hào),另外一列存儲(chǔ)行被刪除的版本號(hào)。每當(dāng)一個(gè)事務(wù)開始的時(shí)候,innodb都會(huì)給這個(gè)事務(wù)分配一個(gè)遞增的版本號(hào),所以版本號(hào)也可以被認(rèn)為是事務(wù)號(hào).對(duì)于每一個(gè)”查詢”語句,innodb都會(huì)把這個(gè)查詢語句的版本號(hào)同這個(gè)查詢語句遇到的行的版本號(hào)進(jìn)行對(duì)比,然后結(jié)合不同的事務(wù)隔離等級(jí),來決定是否返回該行。當(dāng)隔離級(jí)別是REPEATABLE READ時(shí),這種策略下,select、delete、 insert、 update語句如何操作:

1) SELECT:如果要查詢的行被行鎖鎖定,為了提高效率會(huì)去讀取undo日志,提高了效率。如果沒有鎖定呢?根據(jù)條件查詢出結(jié)果并過濾掉deleteVersion早于當(dāng)前事務(wù)的行?

2) INSERT: 對(duì)新插入的行,行的更新版本被修改為該事務(wù)的事務(wù)號(hào)

3) DELETE:對(duì)于刪除,innodb直接把該行的被刪除版本號(hào)設(shè)置為當(dāng)前的事務(wù)號(hào),相當(dāng)于標(biāo)記為刪除,而不是實(shí)際刪除。innodb有一定規(guī)則來觸發(fā)真正的刪除操作

4) UPDATE:在更新行的時(shí)候,innodb會(huì)把原來的行復(fù)制一份到undo段中,并把當(dāng)前的事務(wù)號(hào)作為該行的創(chuàng)建版本?(undo日志到底存的什么?)

在每一行數(shù)據(jù)中額外保存兩個(gè)隱藏字段:當(dāng)前行創(chuàng)建時(shí)的版本號(hào)和刪除時(shí)的版本號(hào)(可能為空)。每個(gè)事務(wù)又有自己的版本號(hào),這樣事務(wù)內(nèi)執(zhí)行CRUD操作時(shí),就通過版本號(hào)的比較來達(dá)到數(shù)據(jù)版本控制的目的。具體做法見下面的示意圖。

MVCC缺點(diǎn):為了實(shí)現(xiàn)多版本,InnoDB需要維護(hù)額外的隱藏字段,以及清理不需要的行版本,帶來額外開銷。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的mysql事务所_mysql事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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