做網(wǎng)站的軟件公司百度競(jìng)價(jià)關(guān)鍵詞
目錄
一、什么是事務(wù)
二、事務(wù)的ACID是什么?
三、有哪些典型的不一致性問(wèn)題?
第一種:臟讀
第二種:不可重復(fù)讀
第三種:幻讀
第四種:丟失更新
四、隔離級(jí)別有哪些?
(1)未提交讀(Read Uncommitted(RU)):
(2)提交讀(Read Committed(RC)):這是oracle 和 SQL server的默認(rèn)隔離級(jí)別
(3)可重復(fù)讀(Repeatable Read(RR)):---mysql默認(rèn)的隔離級(jí)別
(4)串行讀(Serializable):---相當(dāng)于鎖表
五、如何設(shè)置隔離級(jí)別?
?六、事務(wù)管理操作命令
?七、為什么我們登錄MySQL的時(shí)候 每一條命令都能直接生效保存,并沒(méi)有commit和rollback?
一、什么是事務(wù)
事務(wù)是一組數(shù)據(jù)庫(kù)的操作序列,包含一個(gè)或多個(gè)sql操作命令(增刪改),事務(wù)將所有的操作命令看做一個(gè)不可分割的整體,向數(shù)據(jù)庫(kù)系統(tǒng)提交或撤銷操作,所有操作要么執(zhí)行要么不執(zhí)行。
●事務(wù)是一種機(jī)制、一個(gè)操作序列,包含了一組數(shù)據(jù)庫(kù)操作命令,并且把所有的命令作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請(qǐng)求,即這一組數(shù)據(jù)庫(kù)命令要么都執(zhí)行,要么都不執(zhí)行。
●事務(wù)是一個(gè)不可分割的工作邏輯單元,在數(shù)據(jù)庫(kù)系統(tǒng)上執(zhí)行并發(fā)操作時(shí),事務(wù)是最小的控制單元。
●事務(wù)適用于多用戶同時(shí)操作的數(shù)據(jù)庫(kù)系統(tǒng)的場(chǎng)景,如銀行、保險(xiǎn)公司及證券交易系統(tǒng)等等。
●事務(wù)通過(guò)事務(wù)的整體性以保證數(shù)據(jù)的一致性。
●事務(wù)能夠提高在向表中更新和插入信息期間的可靠性。
總結(jié):所謂事務(wù),它是一個(gè)操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個(gè)不可分割的工作單位。
二、事務(wù)的ACID是什么?
ACID是指在可靠數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS中,事務(wù)(transaction)有四個(gè)特性,分別為原子性(atomicity)、一致性(consistency)、隔離性(isolation)、持久性(durability)。
- 原子性(atomicity)
原子性是事務(wù)的基礎(chǔ),表示一個(gè)事務(wù)的所有的命令操作為一個(gè)單元整體,要么執(zhí)行,要么不執(zhí)行;
- 一致性(consistency)
一致性是事務(wù)的目的,為了事務(wù)開(kāi)始前與結(jié)束后的數(shù)據(jù)完整與一致性;
- 隔離性(isolation)
隔離性是事務(wù)的手段,支持在多個(gè)事務(wù)并發(fā)操作的時(shí)候,訪問(wèn)相同的資源的時(shí)候,各自擁有獨(dú)立的數(shù)據(jù)空間;
- 持久性(durability)
持久性是事務(wù)的結(jié)果,表示在完成事務(wù)以后,事務(wù)對(duì)數(shù)據(jù)的更改將會(huì)做永久保存,不會(huì)回滾。
三、有哪些典型的不一致性問(wèn)題?
當(dāng)多個(gè)客戶端并發(fā)地訪問(wèn)同一個(gè)表時(shí),可能出現(xiàn)下面的一致性問(wèn)題:
第一種:臟讀
臟讀就是多個(gè)事務(wù)都在運(yùn)行中,其中事務(wù)a修改完數(shù)據(jù)以后并沒(méi)有結(jié)束事務(wù),事務(wù)b能看到事務(wù)a的修改結(jié)果,這就是臟讀。
舉例實(shí)際案例中:
第二種:不可重復(fù)讀
不可重復(fù)讀就是多個(gè)事務(wù)在運(yùn)行中,其中事務(wù)a修改了數(shù)據(jù)并提交以后,事務(wù)b能看到事務(wù)a的修改,這就是不可重復(fù)讀
舉例實(shí)際案例中:
第三種:幻讀
幻讀就是多個(gè)事務(wù)在運(yùn)行過(guò)程中,事務(wù)a修改了表數(shù)據(jù)的所有行,此時(shí)事務(wù)b也插入了一條數(shù)據(jù),并且事務(wù)b提交事務(wù),此時(shí)事務(wù)a能看到事務(wù)b的數(shù)據(jù),這就是幻讀
?舉例實(shí)際案例中:
第四種:丟失更新
丟失更新的時(shí)候,多個(gè)事務(wù)在進(jìn)行中,此時(shí)事務(wù)b對(duì)某字段進(jìn)行了修改并提交,此時(shí)事務(wù)a并不知情,同時(shí)對(duì)該字段進(jìn)行了修改,覆蓋了事務(wù)b的修改,這就是丟失更新。
??舉例實(shí)際案例中:
四、隔離級(jí)別有哪些?
隔離級(jí)別分為四種,事務(wù)的隔離級(jí)別決定了事務(wù)之間可見(jiàn)的級(jí)別。
MySQL事務(wù)支持如下四種隔離,用以控制事務(wù)所做的修改,并將修改通告至其它并發(fā)的事務(wù):
(1)未提交讀(Read Uncommitted(RU)):
允許臟讀,即允許一個(gè)事務(wù)可以看到其他事務(wù)未提交的修改。
(2)提交讀(Read Committed(RC)):這是oracle 和 SQL server的默認(rèn)隔離級(jí)別
允許一個(gè)事務(wù)只能看到其他事務(wù)已經(jīng)提交的修改,未提交的修改是不可見(jiàn)的。防止臟讀。
(3)可重復(fù)讀(Repeatable Read(RR)):---mysql默認(rèn)的隔離級(jí)別
確保如果在一個(gè)事務(wù)中執(zhí)行兩次相同的語(yǔ)句,都能得到相同的結(jié)果,不管其他事務(wù)是否提交這些修改??梢苑乐古K讀和不可重復(fù)讀。有條件的不允許幻讀(InnoDB存儲(chǔ)引擎可以不允許)
(4)串行讀(Serializable):---相當(dāng)于鎖表
完全串行化的讀,將一個(gè)事務(wù)與其他事務(wù)完全地隔離。每次讀都需要獲得表級(jí)共享鎖,讀寫(xiě)相互都會(huì)阻塞。可以防止臟讀,不可重復(fù)讀取和幻讀,(事務(wù)串行化)會(huì)降低數(shù)據(jù)庫(kù)的效率。
五、如何設(shè)置隔離級(jí)別?
隔離級(jí)別在MySQL中是一個(gè)變量
設(shè)置隔離級(jí)別:
set global transaction isolation level 隔離級(jí)別名稱;
#全局級(jí)別的設(shè)置,可在所有會(huì)話有效,需要重新登錄才可生效set session transaction isolation level 隔離級(jí)別名稱;
#會(huì)話級(jí)別的設(shè)置,在當(dāng)前會(huì)話會(huì)話中立即生效設(shè)置全局事務(wù)隔離級(jí)別:
set global transaction isolation level read committed; ##永久生效
set @@global.tx_isolation='read-committed'; #重啟服務(wù)后失效設(shè)置會(huì)話事務(wù)隔離級(jí)別:
set session transaction isolation level repeatable read;
set @@session.tx_isolation='repeatable-read'; #重啟服務(wù)后失效
查詢隔離級(jí)別,這里的like表示模糊查詢 百分號(hào)相當(dāng)于通配符*的作用
查詢?nèi)质聞?wù)隔離級(jí)別:
show global variables like '%isolation%';
SELECT @@global.tx_isolation;查詢會(huì)話事務(wù)隔離級(jí)別:
show session variables like '%isolation%';
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
?六、事務(wù)管理操作命令
begin; #開(kāi)啟一個(gè)事務(wù)
.... create database/table insert into update XXX set delete from #事務(wù)性操作
savepoint XX; #在事務(wù)中創(chuàng)建回滾點(diǎn)
rollback to XX; #在事務(wù)中回滾操作到指定的回滾點(diǎn)位置
commit; 或 rollback; #提交或回滾結(jié)束事務(wù)
?七、為什么我們登錄MySQL的時(shí)候 每一條命令都能直接生效保存,并沒(méi)有commit和rollback?
因?yàn)橛凶詣?dòng)提交事務(wù)變量!!!
如果開(kāi)啟自動(dòng)提交事務(wù),那么會(huì)將每一條增刪改命令看做一條事務(wù),然后自動(dòng)提交,
如果說(shuō)設(shè)置為0,就是關(guān)閉自動(dòng)提交,那么會(huì)將登錄后的所有的操作命令看做一個(gè)事務(wù),最終需要commit提交一下,否則不生效!!
set [global/session] ?autocommit = 0/1; ? ? ? ?#0關(guān)閉自動(dòng)提交,1開(kāi)啟自動(dòng)提交
show ?[global/session] ?variables like 'autocommit';
?