經(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)前讀語句。