Posted on 2008-07-10 09:42
默認為零 閱讀(1060)
評論(0) 編輯 收藏 所屬分類:
技術(shù)
概要
數(shù)據(jù)庫隔離級別是關(guān)系型數(shù)據(jù)庫保障事務(wù)生命周期過程中幾個層次的數(shù)據(jù)安全策略。
隔離級別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對并發(fā)性能的影響也越大;而隔離級別越低,事務(wù)并發(fā)性越強,但同時會出現(xiàn)與業(yè)務(wù)情況相背的數(shù)據(jù)情況。如果系統(tǒng)壓力偏大而業(yè)務(wù)數(shù)據(jù)能支持較強的容錯情況,我們可以選擇相對較低的事務(wù)隔離級別,在個別應(yīng)用場景可以由應(yīng)用程序采用悲觀鎖或樂觀鎖來控制低級別事務(wù)隔離級別引出的數(shù)據(jù)安全情況;而數(shù)據(jù)一致性需求較強的應(yīng)用場景,如果系統(tǒng)壓力并不大且在一個可控的壓力范圍之內(nèi),我們可以選擇較高的事務(wù)隔離級別支持,甚至可以選擇最高的串行執(zhí)行的隔離級別Serializable。
事務(wù)完整性
事務(wù)完整性可以用ACID特性來衡量事務(wù)的質(zhì)量,違反事務(wù)完整性的問題有3類:臟讀、不可重復(fù)讀和幻像讀。
ACID:原子性(atomicity),一致性(consistency),隔離性(isolation),持續(xù)性(durability)
原子性:事務(wù)是原子的,要不全部完成,要不全部失敗。
一致性:保證數(shù)據(jù)庫的一致性,事務(wù)執(zhí)行之前是一致的,執(zhí)行之后也是一致的。
隔離性:每個事務(wù)必須和其他事務(wù)產(chǎn)生的結(jié)果隔離開來。
持續(xù)性:事務(wù)的持續(xù)性指不管系統(tǒng)發(fā)生了什么故障,事務(wù)處理的結(jié)果都是永久的,數(shù)據(jù)庫產(chǎn)品必須保證,即使存放數(shù)據(jù)的驅(qū)動器融化了,也能將數(shù)據(jù)庫恢復(fù)到驅(qū)動器融化之前,即最后一個事務(wù)提交的瞬間狀態(tài)。
事務(wù)缺陷:臟讀、不可重復(fù)讀、幻像讀
1)臟讀
讀取了其它事務(wù)未提交的數(shù)據(jù)。
2)不可重復(fù)讀
對于單行數(shù)據(jù)來說。事務(wù)A兩次讀取的數(shù)據(jù)不一致,因為看到的是事務(wù)B提交前后的數(shù)據(jù),自然不一致。
3)幻像讀
對于多行數(shù)據(jù)來說。事務(wù)A兩次讀取的行數(shù)不一致,因為在其過程中正巧事務(wù)B修改并提交了滿足事務(wù)A查詢條件的記錄。
幾種隔離級別
以JDBC中Connection的事務(wù)隔離級別定義來說明:
1)Read Uncommitted(TRANSACTION_READ_UNCOMMITTED)
事務(wù)A可以讀取到事務(wù)B未提交的數(shù)據(jù),如果事務(wù)B發(fā)生異常回滾,事務(wù)A讀取到的將是臟數(shù)據(jù)。此事務(wù)隔離級別的應(yīng)用場景中將出現(xiàn)臟讀、不可重復(fù)讀和幻像讀這幾種情況。
2)Read Committed(TRANSACTION_READ_COMMITTED)
事務(wù)A可以讀取到事務(wù)B已經(jīng)提交的數(shù)據(jù),不可讀取到事務(wù)B未提交的數(shù)據(jù),避免了臟讀,但沒有避免不可重復(fù)讀和幻像讀。
3)Repeatable Read(TRANSACTION_REPEATABLE_READ)
可以回避臟讀、不可重復(fù)讀的情況,但無法避免幻像讀。
4)Serializable(TRANSACTION_SERIALIZABLE)
防止所有的事務(wù)缺陷,適用于絕對的事務(wù)完整性的要求比性能更為重要的情況,銀行帳務(wù)系統(tǒng)、高度競爭性的銷售數(shù)據(jù)庫,等等,可以選擇使用Serializable。
事務(wù)隔離級別查看及修改
1)DB2
默認:Read Committed
查看:
修改:a.DB2SET DB2_SQLROUTINE_PREPOPTS=RR|RS|CS|UR
b.db2 change isolation to UR
c.SELECT * FROM tablename WITH UR
(RR-Serializable、RS-Repeatable Read、CS-Read Committed、UR-Read Uncommitted)
2)Oracle
默認:Read Committed
查看:
修改:set transaction isolation level serializable(Oracle只有read committed 和 serializable)
3)Sybase
默認:Read Committed
查看:select @@isolation
修改:set transaction isolation level 0
(level 3-Serializable、level 2-Repeatable Read、level 1-Read Committed、level 0-Read Uncommitted)
4)Sql Server
默認:Read Committed
查看:
修改:set transaction isolation level read uncommitted
5)Mysql
默認:Repeatable Read
查看:select @@tx_isolation;
修改:set transaction isolation level read uncommitted;