事務(wù)ACID&隔離&臟讀&不可重復(fù)讀&幻讀

ACID

原子性:要么都做,要么都不做
一致性:保證原子性,即全部做或者全做就是一致的
隔離性:每個(gè)事務(wù)間不互相影響 isolation
持續(xù)性:永久的改變

例子:從A賬戶取出1萬(wàn)元到B賬戶
事務(wù):

BEGIN TRANSACTION
    讀取A賬戶的存款Balance
    Balance=Balance-amount
    IF (Balance<0) THEN
        ROLLBACK
    ELSE
        讀取B賬戶的存款Balance1
        Balance1=Balcance1+amount
        COMMIT

不可重復(fù)讀&臟讀&幻讀

不可重復(fù)讀

兩次讀的結(jié)果不同。比如:

  1. T1:W1=100 T2 update W2=200 T1檢查有問題

臟讀

上個(gè)銀行轉(zhuǎn)賬的事務(wù):
T1: A賬戶在減去amount得到一個(gè)數(shù)
T2:讀取A賬戶的賬戶值
T1:發(fā)現(xiàn)賬戶值小于0,回滾
T2:呵呵呵呵呵

幻讀

其實(shí)也是不可重讀的一種。有兩種情況
T2直接把W1刪除了,結(jié)果T1再一查,怎么沒有數(shù)據(jù)了。
或是T2又在W1后面填了一個(gè)元素,T1一查怎么多了數(shù)據(jù)

隔離級(jí)別

讀未提交(Read-Uncommitted)

一個(gè)會(huì)話更新的數(shù)據(jù)會(huì)被其他的會(huì)話?cǎi)R上看到,即使未提交。
默認(rèn)的是REEDABLE_READ(可重復(fù)讀)

tx_isolation: 隔離級(jí)別

select @@global.tx_isolation,@@session.tx_isolation,@@tx_isolation
image.png

會(huì)話一:

set tx_isolation='read-uncommitted'
start transaction;
insert into user values(1200,'Tracy',121231,'asdaf') //開啟事務(wù),不提交

會(huì)話二:
查不到

更改成“read-uncommitted”,立馬可以查詢到,即臟讀:

image.png

會(huì)話一Rollback一發(fā),然后會(huì)話二就幻讀了:

image.png

找不到tracy了。

讀提交(Read-committed)

只有提交之后的事務(wù)才能被查詢到。

將會(huì)話二改成 read-committed。

然后在會(huì)話一的事務(wù)里刪除一行數(shù)據(jù)但不提交

start transaction;
delete from user where username='yave'

會(huì)話一種可以立即查詢到刪除,但是會(huì)話二中還是原結(jié)果,
在會(huì)話二中查詢結(jié)果:

image.png

在會(huì)話一中commit之后,會(huì)話二的查詢結(jié)果:

image.png

可重復(fù)讀(Repeatable-read)

當(dāng)事務(wù)隔離級(jí)別設(shè)置為REPEATABLE-READ(可重復(fù)讀)時(shí),在這種狀態(tài)下,同一個(gè)事務(wù)中的多次查詢結(jié)果都是一致的(既不會(huì)出現(xiàn)不可重復(fù)讀的現(xiàn)象),即使在此期間其他會(huì)話更新了數(shù)據(jù),這些數(shù)據(jù)對(duì)其也是不可見的。

在事務(wù)二中先開啟事務(wù)并進(jìn)行查詢操作;

image.png

在事務(wù)一中刪除一行:

start transaction;
delete from user where username='tracy';
commit

繼續(xù)在事務(wù)二中查詢,查詢中tracy依然存在:

image.png

提交事務(wù)二,并開啟新事務(wù)查詢:

image.png

串行化(Serializable)

當(dāng)事務(wù)隔離級(jí)別設(shè)置為SERIALIZABLE(串行讀)時(shí),在這種狀態(tài)下,一個(gè)會(huì)話事務(wù)中的select操作將會(huì)阻塞其他事務(wù)的寫(add、update和delete)操作,但不會(huì)阻塞讀。

比較

l DEFAULT 使用數(shù)據(jù)庫(kù)設(shè)置的隔離級(jí)別 ( 默認(rèn) ) ,由 DBA 默認(rèn)的設(shè)置來決定隔離級(jí)別 .

l READ_UNCOMMITTED 會(huì)出現(xiàn)臟讀、不可重復(fù)讀、幻讀 ( 隔離級(jí)別最低,并發(fā)性能高 )

l READ_COMMITTED 會(huì)出現(xiàn)不可重復(fù)讀、幻讀問題(鎖定正在讀取的行)

l REPEATABLE_READ 會(huì)出幻讀(鎖定所讀取的所有行)

l SERIALIZABLE 保證所有的情況不會(huì)發(fā)生(鎖表)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容