Mysql之事务
什么是事務(wù)
假如你下了一筆訂單,會(huì)有以下數(shù)據(jù)庫(kù)操作:
1. 生成一筆訂單記錄 2. 減少庫(kù)存 3. 從你的賬戶中減少金額 4. 生成支付記錄這邊的四個(gè)操作缺一不可,一旦某一個(gè)操作出現(xiàn)異常,則全部操作都需要全部回滾。而事務(wù)的作用就是保證在出現(xiàn)異常的情況下能夠?qū)Σ僮鬟M(jìn)行回滾。
事務(wù)的特性:
原子性(Atomicity)
??原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾。因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫(kù),如果操作失敗則不能對(duì)數(shù)據(jù)庫(kù)有任何影響。
一致性(Consistency)
??一致性是指事務(wù)必須使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài),也就是說一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
??拿轉(zhuǎn)賬來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性。
隔離性(Isolation)
??隔離性是當(dāng)多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫(kù)時(shí),比如操作同一張表時(shí),數(shù)據(jù)庫(kù)為每一個(gè)用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。
??即要達(dá)到這么一種效果:對(duì)于任意兩個(gè)并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個(gè)事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。
持久性(Durability)
??持久性是指一個(gè)事務(wù)一旦被提交了,那么對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫(kù)系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作。
事務(wù)的隔離級(jí)別
臟讀
??臟讀是指在一個(gè)事務(wù)讀取了另一個(gè)未提交的事務(wù)中的數(shù)據(jù)。
??如:事務(wù)B對(duì)商品C的庫(kù)存進(jìn)行了修改,但是該事務(wù)還未提交。這時(shí)候事務(wù)A讀取了商品C的庫(kù)存,后來發(fā)現(xiàn)代碼有問題,對(duì)事務(wù)B進(jìn)行了回滾,那么事務(wù)A讀取的就是臟數(shù)據(jù)了。
??一般都是事務(wù)的隔離級(jí)別保證的就是這個(gè),隔離級(jí)別越高效率越低。
不可重復(fù)讀
??不可重復(fù)讀是指事務(wù)A在查詢過程中,事務(wù)B修改了數(shù)據(jù)。第一次和第二次的結(jié)果不同。
??但這是可以接受的。
幻讀
?? 幻讀指的是事務(wù)A在讀取過程,事務(wù)B對(duì)添加了一些數(shù)據(jù),導(dǎo)致讀取的結(jié)果長(zhǎng)度有了變化。
場(chǎng)景
具體場(chǎng)景
代碼場(chǎng)景
分布式事務(wù)
?? 假設(shè)上述的操作,在四個(gè)節(jié)點(diǎn)進(jìn)行操作,普通的事務(wù)回滾將不會(huì)有效。因?yàn)椴恢浪械牟僮魇欠穸汲晒α恕?/p>
解決辦法一: 事務(wù)補(bǔ)償
總結(jié)
- 上一篇: Java定时自动锁屏小程序_小程序 番茄
- 下一篇: 判断mysql的关键字_mysql中查询