一遥椿、數(shù)據(jù)庫的事物的基本特性
事物是區(qū)分文件存儲(chǔ)系統(tǒng)與Nosql數(shù)據(jù)庫重要特性之一瑞佩,其存在的意義是為了保證即使在并發(fā)情況下也能正確的執(zhí)行crud操作。怎樣才算是正確的呢竣灌?這時(shí)提出了事物需要保證的四個(gè)特性即ACID:
- A: 原子性(atomicity)
事物中各項(xiàng)操作聂沙,要么全做要么全不做,任何一項(xiàng)操作的失敗都會(huì)導(dǎo)致整個(gè)事物的失敵踵凇及汉; - 一致性(consistency)
事物結(jié)束后系統(tǒng)狀態(tài)是一致的; - 隔離性(isolation)
并發(fā)執(zhí)行的事物彼此無法看到對(duì)方的中間狀態(tài)屯烦; - 持久性(durability)
事物完成后所做的改動(dòng)都會(huì)被持久化坷随,即使發(fā)生災(zāi)難性的失敗。
在高并發(fā)的情況下驻龟,要完全保證其ACID特性是非常困難的温眉,除非把所有的事物串行化執(zhí)行,但帶來的負(fù)面的影響將是性能大打折扣翁狐。很多時(shí)候我們有些業(yè)務(wù)對(duì)事物的要求是不一樣的类溢,所以數(shù)據(jù)庫中設(shè)計(jì)了四種隔離級(jí)別,供用戶基于業(yè)務(wù)進(jìn)行選擇谴蔑。
隔離級(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ù)庫默認(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
二、Sring 對(duì)事物的支持與使用
1洒琢、spring 事物相關(guān)API說明
spring 事物是在數(shù)據(jù)庫事物的基礎(chǔ)上進(jìn)行封裝擴(kuò)展 其主要特性如下:
a. 支持原有的數(shù)據(jù)事物的隔離級(jí)別
b. 加入了事物傳播的概念 提供多個(gè)事物的和并或隔離的功能
c. 提供聲明式事物秧秉,讓業(yè)務(wù)代碼與事物分離,事物變得更易用衰抑。
怎么樣去使用Spring事物呢象迎?spring 提供了三個(gè)接口供使用事物。分別是:
? TransactionDefinition
事物定義
? PlatformTransactionManager
事物管理
? TransactionStatus
事物運(yùn)行時(shí)狀態(tài)
2呛踊、聲明式事物
? 添加 @Transactional 注解