数据库事物相关笔记
一、數(shù)據(jù)庫(kù)的事物的基本特性
事物是區(qū)分文件存儲(chǔ)系統(tǒng)與Nosql數(shù)據(jù)庫(kù)重要特性之一,其存在的意義是為了保證即使在并發(fā)情況下也能正確的執(zhí)行crud操作。怎樣才算是正確的呢?這時(shí)提出了事物需要保證的四個(gè)特性即ACID:
- 事物中各項(xiàng)操作,要么全做要么全不做,任何一項(xiàng)操作的失敗都會(huì)導(dǎo)致整個(gè)事物的失敗;
- 事物結(jié)束后系統(tǒng)狀態(tài)是一致的;
- 并發(fā)執(zhí)行的事物彼此無法看到對(duì)方的中間狀態(tài);
- 事物完成后所做的改動(dòng)都會(huì)被持久化,即使發(fā)生災(zāi)難性的失敗。
在高并發(fā)的情況下,要完全保證其ACID特性是非常困難的,除非把所有的事物串行化執(zhí)行,但帶來的負(fù)面的影響將是性能大打折扣。很多時(shí)候我們有些業(yè)務(wù)對(duì)事物的要求是不一樣的,所以數(shù)據(jù)庫(kù)中設(shè)計(jì)了四種隔離級(jí)別,供用戶基于業(yè)務(wù)進(jìn)行選擇。
二、數(shù)據(jù)庫(kù)的事物的隔離級(jí)別
| 隔離級(jí)別 | 臟讀(Dirty Read) | 不可重復(fù)讀(NonRepeatable Read) | 幻讀(Phantom Read) |
| 未提交讀(Read uncommitted) | 可能 | 可能 | 可能 |
| 已提交讀(Read committed) | 不可能 | 可能 | 可能 |
| 可重復(fù)讀(Repeatable read) | 不可能 | 不可能 | 可能 |
| 可串行化(SERIALIZABLE) | 不可能 | 不可能 | 不可能 |
?
臟讀 :
一個(gè)事物讀取到另一事物未提交的更新數(shù)據(jù)
不可重復(fù)讀 :
在同一事物中,多次讀取同一數(shù)據(jù)返回的結(jié)果有所不同, 換句話說, 后續(xù)讀取可以讀到另一事物已提交的更新數(shù)據(jù). 相反, “可重復(fù)讀”在同一事物中多次讀取數(shù)據(jù)時(shí), 能夠保證所讀數(shù)據(jù)一樣, 也就是后續(xù)讀取不能讀到另一事物已提交的更新數(shù)據(jù)。
幻讀 :
?查詢表中一條數(shù)據(jù)如果不存在就插入一條,并發(fā)的時(shí)候卻發(fā)現(xiàn),里面居然有兩條相同的數(shù)據(jù)。這就幻讀的問題。
?
數(shù)據(jù)庫(kù)默認(rèn)隔離級(jí)別:
Oracle中默認(rèn)級(jí)別是 Read committed
mysql 中默認(rèn)級(jí)別 Repeatable read。另外要注意的是mysql 執(zhí)行一條查詢語句默認(rèn)是一個(gè)獨(dú)立的事物,所以看上去效果跟Read committed一樣。
# 查看mysql 的默認(rèn)隔離級(jí)別
SELECT @@tx_isolation
?
三、事物的傳播機(jī)制
?
?
| 類別 | 事物傳播類型 | 說明 |
| 支持當(dāng)前事物 | PROPAGATION_REQUIRED (必須的) | 如果當(dāng)前沒有事物,就新建一個(gè)事物,如果已經(jīng)存在一個(gè)事物中,加入到這個(gè)事物中。這是最常見的選擇。 |
| PROPAGATION_SUPPORTS (支持) | 支持當(dāng)前事物,如果當(dāng)前沒有事物,就以非事物方式執(zhí)行。 | |
| PROPAGATION_MANDATORY (強(qiáng)制) | 使用當(dāng)前的事物,如果當(dāng)前沒有事物,就拋出異常。 | |
| 不支持當(dāng)前事物 | PROPAGATION_REQUIRES_NEW (隔離) | 新建事物,如果當(dāng)前存在事物,把當(dāng)前事物掛起。 |
| PROPAGATION_NOT_SUPPORTED (不支持) | 以非事物方式執(zhí)行操作,如果當(dāng)前存在事物,就把當(dāng)前事物掛起。 | |
| PROPAGATION_NEVER (強(qiáng)制非事物) | 以非事物方式執(zhí)行,如果當(dāng)前存在事物,則拋出異常。 | |
| 套事物 | PROPAGATION_NESTED (嵌套事物) | 如果當(dāng)前存在事物,則在嵌套事物內(nèi)執(zhí)行。如果當(dāng)前沒有事物,則執(zhí)行與PROPAGATION_REQUIRED類似的操作。 |
常用事物傳播機(jī)制:
- 這個(gè)也是默認(rèn)的傳播機(jī)制;
- 可以用于發(fā)送提示消息,站內(nèi)信、短信、郵件提示等。不屬于并且不應(yīng)當(dāng)影響主體業(yè)務(wù)邏輯,即使發(fā)送失敗也不應(yīng)該對(duì)主體業(yè)務(wù)邏輯回滾。
- 總是新啟一個(gè)事物,這個(gè)傳播機(jī)制適用于不受父方法事物影響的操作,比如某些業(yè)務(wù)場(chǎng)景下需要記錄業(yè)務(wù)日志,用于異步反查,那么不管主體業(yè)務(wù)邏輯是否完成,日志都需要記錄下來,不能因?yàn)橹黧w業(yè)務(wù)邏輯報(bào)錯(cuò)而丟失日志;
總結(jié)
- 上一篇: 【amtlib.dll文件下载】amtl
- 下一篇: OnItemClickListener,