MySQL聽講(二)——事務(wù)

經(jīng)常聽人說事務(wù),事務(wù)具有ACID,現(xiàn)在來說一說事務(wù):

隔離性

事務(wù)的隔離,實(shí)際上是一個(gè)虛擬視圖的創(chuàng)建。

隔離級(jí)別 意義 視圖創(chuàng)建時(shí)間
讀未提交 一個(gè)事務(wù)還沒提交時(shí),他的變更就可以被別的事務(wù)看到
讀提交 一個(gè)事務(wù)提交之后,他的變更才被其他事務(wù)看到 每個(gè)SQL開始執(zhí)行時(shí)創(chuàng)建視圖
可重復(fù)讀 一個(gè)事務(wù)執(zhí)行中看到的數(shù)據(jù),和事務(wù)啟動(dòng)時(shí)看到的一致。其未提交的變更,其他事務(wù)也不可見 事務(wù)啟動(dòng)時(shí)創(chuàng)建視圖
序列化 對(duì)于同一行記錄,按順序執(zhí)行 加鎖,沒有視圖
讀加讀鎖
寫加寫鎖

關(guān)于隔離級(jí)別的查詢:

show VARIABLES LIKE 'transaction_isolation';

MySQL默認(rèn)的隔離級(jí)別是可重復(fù)讀。其MVCC(多版本并發(fā)控制)就是依賴于事務(wù)的視圖。
在每一個(gè)事務(wù)中存在著虛擬視圖、修改的新記錄、回滾到舊記錄的記錄(回滾段)。

盡量不要使用長(zhǎng)事務(wù),原因有下:

  • 占空間。長(zhǎng)事務(wù)會(huì)意味著系統(tǒng)里存在著很老的視圖。再提交之前,這些東西會(huì)一直占用存儲(chǔ)空間(期間會(huì)使用到磁盤和內(nèi)存,參見第一節(jié)中的redo log部分)。
  • 占有鎖。鎖資源占有時(shí)間長(zhǎng)了會(huì)拖垮數(shù)據(jù)庫的。

查詢長(zhǎng)事務(wù),如下是查詢事務(wù)時(shí)間超過60s的:

select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;

關(guān)閉長(zhǎng)事務(wù)(MySQL默認(rèn)為關(guān)閉的):

set AUTOCOMMIT =1;

幻讀

在同一事物中,前后兩次查詢同一范圍時(shí),后一次查詢看到了前一次查看沒有看到的值。
幻讀只發(fā)生在“當(dāng)前讀”下,且幻讀僅指新插入的行。
select * from t where name='x' for update;這就是一條當(dāng)前讀語句。

最后編輯于
?著作權(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)容